66using System ;
77using System . Collections . Generic ;
88using System . Linq ;
9+ using System . Linq . Expressions ;
910using System . Threading . Tasks ;
1011using TestContext = Nodes . NetCore . EntityFramework . Tests . Mocks . TestContext ;
1112
@@ -16,7 +17,6 @@ public class EntityRepositoryTests
1617 private TestEntityRepository _repository ;
1718 private TestContext _context ;
1819 private TestEntity _entity ;
19- private TestEntity _deletedEntity ;
2020 private IEnumerable < TestEntity > _listEntities ;
2121
2222 [ SetUp ]
@@ -35,24 +35,12 @@ public void Setup()
3535 _entity = new TestEntity
3636 {
3737 Created = now ,
38- Deleted = false ,
3938 Id = Guid . NewGuid ( ) ,
4039 Updated = now ,
4140 Property = string . Empty
4241 } ;
4342
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-
5443 _context . Table . Add ( _entity ) ;
55- _context . Table . Add ( _deletedEntity ) ;
5644
5745 _listEntities = GetTestList ( ) ;
5846 _context . Table . AddRange ( _listEntities ) ;
@@ -70,33 +58,32 @@ public async Task AddAddsEntityAndSetsAttributes()
7058 int expectedSize = startSize + 1 ;
7159 var entity = new TestEntity ( ) ;
7260
73- using ( _repository )
61+ await using ( _repository )
7462 {
7563 await _repository . Add ( entity ) ;
7664 }
7765
78- Assert . NotNull ( entity . Id ) ;
66+ Assert . AreNotEqual ( Guid . Empty , entity . Id ) ;
7967 Assert . AreNotEqual ( default ( DateTime ) , entity . Created ) ;
8068 Assert . AreNotEqual ( default ( DateTime ) , entity . Updated ) ;
81- Assert . IsFalse ( entity . Deleted ) ;
8269 Assert . AreEqual ( expectedSize , await _context . Table . CountAsync ( ) ) ;
8370 }
8471
8572 [ Test ]
86- public async Task AddEntityWithIdKeepsId ( )
73+ [ AutoData ]
74+ public async Task AddEntityWithIdKeepsId ( Guid idToCreate )
8775 {
88- Guid id = Guid . NewGuid ( ) ;
8976 var entity = new TestEntity
9077 {
91- Id = id
78+ Id = idToCreate
9279 } ;
9380
94- using ( _repository )
81+ await using ( _repository )
9582 {
9683 await _repository . Add ( entity ) ;
9784 }
9885
99- Assert . AreEqual ( id , entity . Id ) ;
86+ Assert . AreEqual ( idToCreate , entity . Id ) ;
10087 }
10188
10289 [ Test ]
@@ -107,28 +94,12 @@ public void AddThrowsExceptionIfEntityIsNull()
10794 #endregion
10895
10996 #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-
11897 [ Test ]
11998 public async Task GetListReturnsAll ( )
12099 {
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 ) ;
130101
131- Assert . AreEqual ( 1 , entities . Count ( ) ) ;
102+ Assert . AreEqual ( _listEntities . Count ( ) + 1 , entities . Count ( ) ) ;
132103 }
133104
134105 [ Test ]
@@ -196,6 +167,80 @@ public async Task GetListPaginated()
196167 Assert . AreEqual ( 3 , entitiesLastPage . Count ( ) ) ;
197168 }
198169
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+
199244 private IEnumerable < TestEntity > GetTestList ( )
200245 {
201246 return new List < TestEntity >
@@ -233,26 +278,19 @@ private TestEntity GetTestEntity(string property)
233278 [ Test ]
234279 public async Task GetValidEntityReturnsEntity ( )
235280 {
236- var entity = await _repository . Get ( ( Guid ) _entity . Id ) ;
281+ var entity = await _repository . Get ( _entity . Id ) ;
237282
238283 Assert . AreSame ( _entity , entity ) ;
239284 }
240285
241286 [ Test ]
242- public async Task DontGetDeletedEntityWithoutFlag ( )
287+ [ AutoData ]
288+ public async Task DontGetNonExistantEntity ( Guid nonExistantId )
243289 {
244- var entity = await _repository . Get ( ( Guid ) _deletedEntity . Id ) ;
290+ var entity = await _repository . Get ( nonExistantId ) ;
245291
246292 Assert . IsNull ( entity ) ;
247293 }
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- }
256294 #endregion
257295
258296 #region Update
@@ -264,12 +302,12 @@ public async Task UpdateUpdatesUpdated(string propertyValue)
264302 DateTime oldCreated = _entity . Created ;
265303 _entity . Property = propertyValue ;
266304
267- using ( _repository )
305+ await using ( _repository )
268306 {
269307 await _repository . Update ( _entity ) ;
270308 }
271309
272- var entity = await _repository . Get ( ( Guid ) _entity . Id ) ;
310+ var entity = await _repository . Get ( _entity . Id ) ;
273311
274312 Assert . AreEqual ( propertyValue , entity . Property ) ;
275313 Assert . AreNotEqual ( oldUpdated , entity . Updated ) ;
@@ -285,121 +323,60 @@ public void UpdateThrowsExceptionIfNull()
285323
286324 #region Delete
287325 [ Test ]
288- public async Task DeleteSoftDeletesAndSetsDeletedAt ( )
326+ public async Task DeleteDeletesEntity ( )
289327 {
290328 bool success ;
291- using ( _repository )
329+ var expectedEntityCount = _context . Table . Count ( ) - 1 ;
330+ await using ( _repository )
292331 {
293332 success = await _repository . Delete ( _entity ) ;
294333 }
295334
296- var newlyDeletedEntity = await _repository . Get ( ( Guid ) _entity . Id , true ) ;
335+ var newlyDeletedEntity = await _repository . Get ( _entity . Id ) ;
297336 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 ( ) ) ;
306339 }
307-
308340 [ Test ]
309- public async Task DeleteWithValidIdDeletesAndSetsDeletedAt ( )
341+ public async Task DeleteOnIdDeletesEntity ( )
310342 {
311343 bool success ;
312- Guid id = ( Guid ) _entity . Id ;
313- using ( _repository )
344+ var expectedEntityCount = _context . Table . Count ( ) - 1 ;
345+ await using ( _repository )
314346 {
315- success = await _repository . Delete ( id ) ;
347+ success = await _repository . Delete ( _entity . Id ) ;
316348 }
317349
318- var newlyDeletedEntity = await _repository . Get ( id , true ) ;
350+ var newlyDeletedEntity = await _repository . Get ( _entity . Id ) ;
319351 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 ( ) ) ;
336354 }
337355
338356 [ 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 ( )
370358 {
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 ) ) ;
383360 }
384361
385362 [ Test ]
386363 [ AutoData ]
387- public async Task RestoreOnInvalidIdReturnsFalse ( Guid randomId )
364+ public async Task DeleteWithInvalidIdReturnsFalse ( Guid randomId )
388365 {
389366 bool success ;
390367
391- using ( _repository )
368+ await using ( _repository )
392369 {
393- success = await _repository . Restore ( randomId ) ;
370+ success = await _repository . Delete ( randomId ) ;
394371 }
395372
396373 Assert . IsFalse ( success ) ;
397374 }
398375
399376 [ Test ]
400- public void RestoreOnEmptyGuidThrowsException ( )
377+ public void DeleteWithEmptyGuidThrowsException ( )
401378 {
402- Assert . ThrowsAsync < ArgumentException > ( ( ) => _repository . Restore ( Guid . Empty ) ) ;
379+ Assert . ThrowsAsync < ArgumentException > ( ( ) => _repository . Delete ( Guid . Empty ) ) ;
403380 }
404381 #endregion
405382 }
0 commit comments