6
6
using System ;
7
7
using System . Collections . Generic ;
8
8
using System . Linq ;
9
+ using System . Linq . Expressions ;
9
10
using System . Threading . Tasks ;
10
11
using TestContext = Nodes . NetCore . EntityFramework . Tests . Mocks . TestContext ;
11
12
@@ -16,7 +17,6 @@ public class EntityRepositoryTests
16
17
private TestEntityRepository _repository ;
17
18
private TestContext _context ;
18
19
private TestEntity _entity ;
19
- private TestEntity _deletedEntity ;
20
20
private IEnumerable < TestEntity > _listEntities ;
21
21
22
22
[ SetUp ]
@@ -35,24 +35,12 @@ public void Setup()
35
35
_entity = new TestEntity
36
36
{
37
37
Created = now ,
38
- Deleted = false ,
39
38
Id = Guid . NewGuid ( ) ,
40
39
Updated = now ,
41
40
Property = string . Empty
42
41
} ;
43
42
44
- _deletedEntity = new TestEntity
45
- {
46
- Created = now . AddMinutes ( - 42 ) ,
47
- Deleted = true ,
48
- DeletedAt = now ,
49
- Id = Guid . NewGuid ( ) ,
50
- Updated = now . AddMinutes ( - 42 ) ,
51
- Property = "I'm deleted"
52
- } ;
53
-
54
43
_context . Table . Add ( _entity ) ;
55
- _context . Table . Add ( _deletedEntity ) ;
56
44
57
45
_listEntities = GetTestList ( ) ;
58
46
_context . Table . AddRange ( _listEntities ) ;
@@ -70,33 +58,32 @@ public async Task AddAddsEntityAndSetsAttributes()
70
58
int expectedSize = startSize + 1 ;
71
59
var entity = new TestEntity ( ) ;
72
60
73
- using ( _repository )
61
+ await using ( _repository )
74
62
{
75
63
await _repository . Add ( entity ) ;
76
64
}
77
65
78
- Assert . NotNull ( entity . Id ) ;
66
+ Assert . AreNotEqual ( Guid . Empty , entity . Id ) ;
79
67
Assert . AreNotEqual ( default ( DateTime ) , entity . Created ) ;
80
68
Assert . AreNotEqual ( default ( DateTime ) , entity . Updated ) ;
81
- Assert . IsFalse ( entity . Deleted ) ;
82
69
Assert . AreEqual ( expectedSize , await _context . Table . CountAsync ( ) ) ;
83
70
}
84
71
85
72
[ Test ]
86
- public async Task AddEntityWithIdKeepsId ( )
73
+ [ AutoData ]
74
+ public async Task AddEntityWithIdKeepsId ( Guid idToCreate )
87
75
{
88
- Guid id = Guid . NewGuid ( ) ;
89
76
var entity = new TestEntity
90
77
{
91
- Id = id
78
+ Id = idToCreate
92
79
} ;
93
80
94
- using ( _repository )
81
+ await using ( _repository )
95
82
{
96
83
await _repository . Add ( entity ) ;
97
84
}
98
85
99
- Assert . AreEqual ( id , entity . Id ) ;
86
+ Assert . AreEqual ( idToCreate , entity . Id ) ;
100
87
}
101
88
102
89
[ Test ]
@@ -107,28 +94,12 @@ public void AddThrowsExceptionIfEntityIsNull()
107
94
#endregion
108
95
109
96
#region List
110
- [ Test ]
111
- public async Task GetListReturnsAllNotDeleted ( )
112
- {
113
- var entities = await _repository . GetList ( ) ;
114
-
115
- Assert . AreEqual ( _listEntities . Count ( ) + 1 , entities . Count ( ) ) ;
116
- }
117
-
118
97
[ Test ]
119
98
public async Task GetListReturnsAll ( )
120
99
{
121
- var entities = await _repository . GetList ( null , null , OrderBy . Ascending , GetListMode . IncludeDeleted ) ;
122
-
123
- Assert . AreEqual ( _listEntities . Count ( ) + 2 , entities . Count ( ) ) ;
124
- }
125
-
126
- [ Test ]
127
- public async Task GetListReturnsAllDeleted ( )
128
- {
129
- var entities = await _repository . GetList ( null , null , OrderBy . Ascending , GetListMode . OnlyDeleted ) ;
100
+ var entities = await _repository . GetList ( null , null , OrderBy . Ascending ) ;
130
101
131
- Assert . AreEqual ( 1 , entities . Count ( ) ) ;
102
+ Assert . AreEqual ( _listEntities . Count ( ) + 1 , entities . Count ( ) ) ;
132
103
}
133
104
134
105
[ Test ]
@@ -196,6 +167,80 @@ public async Task GetListPaginated()
196
167
Assert . AreEqual ( 3 , entitiesLastPage . Count ( ) ) ;
197
168
}
198
169
170
+ [ Test ]
171
+ public async Task GetListWithSelectReturnsAll ( )
172
+ {
173
+ var entities = await _repository . GetListWithSelect < string > ( e => e . Property ) ;
174
+
175
+ Assert . AreEqual ( _listEntities . Count ( ) + 1 , entities . Count ( ) ) ;
176
+ }
177
+
178
+ [ Test ]
179
+ public async Task GetListWithSelectWhere ( )
180
+ {
181
+ const string propertyToLookFor = "b" ;
182
+ IEnumerable < string > entities = await _repository . GetListWithSelect ( x => x . Property , x => x . Property == propertyToLookFor ) ;
183
+
184
+ Assert . AreEqual ( 1 , entities . Count ( ) ) ;
185
+ Assert . AreEqual ( propertyToLookFor , entities . ElementAt ( 0 ) ) ;
186
+ }
187
+
188
+ [ Test ]
189
+ public async Task GetListWithSelectOrderBy ( )
190
+ {
191
+ var entities = await _repository . GetListWithSelect ( x => x . Property , x => x . Property . Length == 1 , x => x . Property ) ;
192
+
193
+ Assert . AreEqual ( _listEntities . Count ( ) , entities . Count ( ) ) ;
194
+ Assert . AreEqual ( "a" , entities . ElementAt ( 0 ) ) ;
195
+ Assert . AreEqual ( "b" , entities . ElementAt ( 1 ) ) ;
196
+ Assert . AreEqual ( "c" , entities . ElementAt ( 2 ) ) ;
197
+ Assert . AreEqual ( "d" , entities . ElementAt ( 3 ) ) ;
198
+ Assert . AreEqual ( "e" , entities . ElementAt ( 4 ) ) ;
199
+ Assert . AreEqual ( "f" , entities . ElementAt ( 5 ) ) ;
200
+ Assert . AreEqual ( "g" , entities . ElementAt ( 6 ) ) ;
201
+ Assert . AreEqual ( "h" , entities . ElementAt ( 7 ) ) ;
202
+ Assert . AreEqual ( "i" , entities . ElementAt ( 8 ) ) ;
203
+ Assert . AreEqual ( "j" , entities . ElementAt ( 9 ) ) ;
204
+ Assert . AreEqual ( "k" , entities . ElementAt ( 10 ) ) ;
205
+ Assert . AreEqual ( "l" , entities . ElementAt ( 11 ) ) ;
206
+ Assert . AreEqual ( "m" , entities . ElementAt ( 12 ) ) ;
207
+ Assert . AreEqual ( "n" , entities . ElementAt ( 13 ) ) ;
208
+ }
209
+
210
+ [ Test ]
211
+ public async Task GetListWithSelectOrderByDescending ( )
212
+ {
213
+ var entities = await _repository . GetListWithSelect ( x => x . Property , x => x . Property . Length == 1 , x => x . Property , OrderBy . Descending ) ;
214
+
215
+ Assert . AreEqual ( _listEntities . Count ( ) , entities . Count ( ) ) ;
216
+ Assert . AreEqual ( "n" , entities . ElementAt ( 0 ) ) ;
217
+ Assert . AreEqual ( "m" , entities . ElementAt ( 1 ) ) ;
218
+ Assert . AreEqual ( "l" , entities . ElementAt ( 2 ) ) ;
219
+ Assert . AreEqual ( "k" , entities . ElementAt ( 3 ) ) ;
220
+ Assert . AreEqual ( "j" , entities . ElementAt ( 4 ) ) ;
221
+ Assert . AreEqual ( "i" , entities . ElementAt ( 5 ) ) ;
222
+ Assert . AreEqual ( "h" , entities . ElementAt ( 6 ) ) ;
223
+ Assert . AreEqual ( "g" , entities . ElementAt ( 7 ) ) ;
224
+ Assert . AreEqual ( "f" , entities . ElementAt ( 8 ) ) ;
225
+ Assert . AreEqual ( "e" , entities . ElementAt ( 9 ) ) ;
226
+ Assert . AreEqual ( "d" , entities . ElementAt ( 10 ) ) ;
227
+ Assert . AreEqual ( "c" , entities . ElementAt ( 11 ) ) ;
228
+ Assert . AreEqual ( "b" , entities . ElementAt ( 12 ) ) ;
229
+ Assert . AreEqual ( "a" , entities . ElementAt ( 13 ) ) ;
230
+ }
231
+
232
+ [ Test ]
233
+ public async Task GetListWithSelectPaginated ( )
234
+ {
235
+ const int pageSize = 6 ;
236
+
237
+ var entities = await _repository . GetListWithSelect ( x => x . Property , 1 , pageSize ) ;
238
+ var entitiesLastPage = await _repository . GetListWithSelect ( x => x . Property , 3 , pageSize ) ;
239
+
240
+ Assert . AreEqual ( pageSize , entities . Count ( ) ) ;
241
+ Assert . AreEqual ( 3 , entitiesLastPage . Count ( ) ) ;
242
+ }
243
+
199
244
private IEnumerable < TestEntity > GetTestList ( )
200
245
{
201
246
return new List < TestEntity >
@@ -233,26 +278,19 @@ private TestEntity GetTestEntity(string property)
233
278
[ Test ]
234
279
public async Task GetValidEntityReturnsEntity ( )
235
280
{
236
- var entity = await _repository . Get ( ( Guid ) _entity . Id ) ;
281
+ var entity = await _repository . Get ( _entity . Id ) ;
237
282
238
283
Assert . AreSame ( _entity , entity ) ;
239
284
}
240
285
241
286
[ Test ]
242
- public async Task DontGetDeletedEntityWithoutFlag ( )
287
+ [ AutoData ]
288
+ public async Task DontGetNonExistantEntity ( Guid nonExistantId )
243
289
{
244
- var entity = await _repository . Get ( ( Guid ) _deletedEntity . Id ) ;
290
+ var entity = await _repository . Get ( nonExistantId ) ;
245
291
246
292
Assert . IsNull ( entity ) ;
247
293
}
248
-
249
- [ Test ]
250
- public async Task GetDeletedEntityWithFlag ( )
251
- {
252
- var entity = await _repository . Get ( ( Guid ) _deletedEntity . Id , true ) ;
253
-
254
- Assert . AreSame ( _deletedEntity , entity ) ;
255
- }
256
294
#endregion
257
295
258
296
#region Update
@@ -264,12 +302,12 @@ public async Task UpdateUpdatesUpdated(string propertyValue)
264
302
DateTime oldCreated = _entity . Created ;
265
303
_entity . Property = propertyValue ;
266
304
267
- using ( _repository )
305
+ await using ( _repository )
268
306
{
269
307
await _repository . Update ( _entity ) ;
270
308
}
271
309
272
- var entity = await _repository . Get ( ( Guid ) _entity . Id ) ;
310
+ var entity = await _repository . Get ( _entity . Id ) ;
273
311
274
312
Assert . AreEqual ( propertyValue , entity . Property ) ;
275
313
Assert . AreNotEqual ( oldUpdated , entity . Updated ) ;
@@ -285,121 +323,60 @@ public void UpdateThrowsExceptionIfNull()
285
323
286
324
#region Delete
287
325
[ Test ]
288
- public async Task DeleteSoftDeletesAndSetsDeletedAt ( )
326
+ public async Task DeleteDeletesEntity ( )
289
327
{
290
328
bool success ;
291
- using ( _repository )
329
+ var expectedEntityCount = _context . Table . Count ( ) - 1 ;
330
+ await using ( _repository )
292
331
{
293
332
success = await _repository . Delete ( _entity ) ;
294
333
}
295
334
296
- var newlyDeletedEntity = await _repository . Get ( ( Guid ) _entity . Id , true ) ;
335
+ var newlyDeletedEntity = await _repository . Get ( _entity . Id ) ;
297
336
Assert . IsTrue ( success ) ;
298
- Assert . IsTrue ( newlyDeletedEntity . Deleted ) ;
299
- Assert . NotNull ( newlyDeletedEntity . DeletedAt ) ;
300
- }
301
-
302
- [ Test ]
303
- public void DeleteThrowsExceptionIfArgumentNull ( )
304
- {
305
- Assert . ThrowsAsync < ArgumentNullException > ( ( ) => _repository . Delete ( null ) ) ;
337
+ Assert . IsNull ( newlyDeletedEntity ) ;
338
+ Assert . AreEqual ( expectedEntityCount , _context . Table . Count ( ) ) ;
306
339
}
307
-
308
340
[ Test ]
309
- public async Task DeleteWithValidIdDeletesAndSetsDeletedAt ( )
341
+ public async Task DeleteOnIdDeletesEntity ( )
310
342
{
311
343
bool success ;
312
- Guid id = ( Guid ) _entity . Id ;
313
- using ( _repository )
344
+ var expectedEntityCount = _context . Table . Count ( ) - 1 ;
345
+ await using ( _repository )
314
346
{
315
- success = await _repository . Delete ( id ) ;
347
+ success = await _repository . Delete ( _entity . Id ) ;
316
348
}
317
349
318
- var newlyDeletedEntity = await _repository . Get ( id , true ) ;
350
+ var newlyDeletedEntity = await _repository . Get ( _entity . Id ) ;
319
351
Assert . IsTrue ( success ) ;
320
- Assert . IsTrue ( newlyDeletedEntity . Deleted ) ;
321
- Assert . NotNull ( newlyDeletedEntity . DeletedAt ) ;
322
- }
323
-
324
- [ Test ]
325
- [ AutoData ]
326
- public async Task DeleteWithInvalidIdReturnsFalse ( Guid randomId )
327
- {
328
- bool success ;
329
-
330
- using ( _repository )
331
- {
332
- success = await _repository . Delete ( randomId ) ;
333
- }
334
-
335
- Assert . IsFalse ( success ) ;
352
+ Assert . IsNull ( newlyDeletedEntity ) ;
353
+ Assert . AreEqual ( expectedEntityCount , _context . Table . Count ( ) ) ;
336
354
}
337
355
338
356
[ Test ]
339
- public void DeleteWithEmptyGuidThrowsException ( )
340
- {
341
- Assert . ThrowsAsync < ArgumentException > ( ( ) => _repository . Delete ( Guid . Empty ) ) ;
342
- }
343
- #endregion
344
-
345
- #region Restore
346
- [ Test ]
347
- public async Task RestoreSetsDeletedFalse ( )
348
- {
349
- bool success ;
350
-
351
- using ( _repository )
352
- {
353
- success = await _repository . Restore ( _deletedEntity ) ;
354
- }
355
-
356
- var restoredEntity = await _repository . Get ( ( Guid ) _deletedEntity . Id ) ;
357
- Assert . IsTrue ( success ) ;
358
- Assert . IsFalse ( restoredEntity . Deleted ) ;
359
- Assert . IsNull ( restoredEntity . DeletedAt ) ;
360
- }
361
-
362
- [ Test ]
363
- public void RestoreThrowsExceptionWhenEntityNull ( )
364
- {
365
- Assert . ThrowsAsync < ArgumentNullException > ( ( ) => _repository . Restore ( null ) ) ;
366
- }
367
-
368
- [ Test ]
369
- public async Task RestoreOnIdSetsDeletedFalse ( )
357
+ public void DeleteThrowsExceptionIfArgumentNull ( )
370
358
{
371
- bool success ;
372
- Guid id = ( Guid ) _deletedEntity . Id ;
373
-
374
- using ( _repository )
375
- {
376
- success = await _repository . Restore ( id ) ;
377
- }
378
-
379
- var restoredEntity = await _repository . Get ( id ) ;
380
- Assert . IsTrue ( success ) ;
381
- Assert . IsFalse ( restoredEntity . Deleted ) ;
382
- Assert . IsNull ( restoredEntity . DeletedAt ) ;
359
+ Assert . ThrowsAsync < ArgumentNullException > ( ( ) => _repository . Delete ( null ) ) ;
383
360
}
384
361
385
362
[ Test ]
386
363
[ AutoData ]
387
- public async Task RestoreOnInvalidIdReturnsFalse ( Guid randomId )
364
+ public async Task DeleteWithInvalidIdReturnsFalse ( Guid randomId )
388
365
{
389
366
bool success ;
390
367
391
- using ( _repository )
368
+ await using ( _repository )
392
369
{
393
- success = await _repository . Restore ( randomId ) ;
370
+ success = await _repository . Delete ( randomId ) ;
394
371
}
395
372
396
373
Assert . IsFalse ( success ) ;
397
374
}
398
375
399
376
[ Test ]
400
- public void RestoreOnEmptyGuidThrowsException ( )
377
+ public void DeleteWithEmptyGuidThrowsException ( )
401
378
{
402
- Assert . ThrowsAsync < ArgumentException > ( ( ) => _repository . Restore ( Guid . Empty ) ) ;
379
+ Assert . ThrowsAsync < ArgumentException > ( ( ) => _repository . Delete ( Guid . Empty ) ) ;
403
380
}
404
381
#endregion
405
382
}
0 commit comments