You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuEfCrudTests.cs 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using Luticate2.Auth.Tests.DataAccess.Crud.Models;
  6. using Luticate2.Auth.Utils.Business.Converters;
  7. using Luticate2.Auth.Utils.Business.Converters.ObjectConverterDescriptor;
  8. using Luticate2.Auth.Utils.Business.Fields;
  9. using Luticate2.Auth.Utils.DataAccess.Crud;
  10. using Luticate2.Auth.Utils.Dbo;
  11. using Luticate2.Auth.Utils.Dbo.Fields;
  12. using Luticate2.Auth.Utils.Dbo.Pagination;
  13. using Luticate2.Auth.Utils.Dbo.Result;
  14. using Luticate2.Auth.Utils.Interfaces;
  15. using Microsoft.EntityFrameworkCore;
  16. using Microsoft.Extensions.DependencyInjection;
  17. using Xunit;
  18. namespace Luticate2.Auth.Tests.DataAccess.Crud
  19. {
  20. public class LuEfCrudTests : IDisposable
  21. {
  22. public class TableSimple1Dbo
  23. {
  24. public Guid Id { get; set; }
  25. public string Name { get; set; }
  26. public int Priority { get; set; }
  27. public string Comment { get; set; }
  28. public int? OptionalInt { get; set; }
  29. public DateTime CreatedAt { get; set; }
  30. public DateTime? UpdatedAt { get; set; }
  31. }
  32. public class TableSimple1DboDescriptor : LuObjectConverterDescriptor<TableSimple1Dbo, table_simple_1>
  33. {
  34. public TableSimple1DboDescriptor()
  35. {
  36. AddStaticMemberConverter(dbo => dbo.Id, model => model.id);
  37. AddStaticMemberConverter(dbo => dbo.Name, model => model.name);
  38. AddStaticMemberConverter(dbo => dbo.Priority, model => model.priority);
  39. AddStaticMemberConverter(dbo => dbo.Comment, model => model.comment);
  40. AddStaticMemberConverter(dbo => dbo.OptionalInt, model => model.optional_int);
  41. AddStaticMemberConverter(dbo => dbo.CreatedAt, model => model.created_at);
  42. AddStaticMemberConverter(dbo => dbo.UpdatedAt, model => model.updated_at);
  43. }
  44. }
  45. public class TableSimple1ModelDescriptor : LuObjectConverterDescriptor<table_simple_1, TableSimple1Dbo>
  46. {
  47. public TableSimple1ModelDescriptor()
  48. {
  49. AddStaticMemberConverter(model => model.id, dbo => dbo.Id);
  50. AddStaticMemberConverter(model => model.name, dbo => dbo.Name);
  51. AddStaticMemberConverter(model => model.priority, dbo => dbo.Priority);
  52. AddStaticMemberConverter(model => model.comment, dbo => dbo.Comment);
  53. AddStaticMemberConverter(model => model.optional_int, dbo => dbo.OptionalInt);
  54. AddStaticMemberConverter(model => model.created_at, dbo => dbo.CreatedAt);
  55. AddStaticMemberConverter(model => model.updated_at, dbo => dbo.UpdatedAt);
  56. }
  57. }
  58. public class TableSimple1DataAccess : LuEfCrudDataAccess<TableSimple1Dbo, table_simple_1, luticate2_unit_testsContext>
  59. {
  60. public TableSimple1DataAccess(IServiceProvider serviceProvider) : base(serviceProvider)
  61. {
  62. }
  63. }
  64. public IServiceProvider ServiceProvider { get; set; }
  65. public luticate2_unit_testsContext Luticate2UnitTestsContext { get; set; }
  66. public LuEfCrudTests()
  67. {
  68. var services = new ServiceCollection();
  69. services.AddLuObjectConverterDescriptors();
  70. // DB read
  71. services.AddSingleton<ILuObjectConverterDescriptor<TableSimple1Dbo, table_simple_1>, TableSimple1DboDescriptor>();
  72. // DB write
  73. services.AddSingleton<ILuObjectConverterDescriptor<table_simple_1, TableSimple1Dbo>, TableSimple1ModelDescriptor>();
  74. services.AddLuObjectConverters();
  75. // DB read
  76. services.AddLuObjectConverterPoco<table_simple_1, TableSimple1Dbo>();
  77. // DB write
  78. services.AddLuObjectConverterPoco<TableSimple1Dbo, table_simple_1>();
  79. services.AddSingleton<ILuConvertersTypeConverter>(new LuConvertersTypeConverter(new Dictionary<Type, Type>
  80. {
  81. {typeof(TableSimple1Dbo), typeof(table_simple_1)} // DB read
  82. }));
  83. services.AddDbContext<luticate2_unit_testsContext>(options =>
  84. {
  85. options.UseNpgsql(@"Host=localhost;Database=luticate2_unit_tests;Username=dev;Password=dev");
  86. options.UseInternalServiceProvider(new ServiceCollection()
  87. .AddEntityFrameworkNpgsql()
  88. .BuildServiceProvider());
  89. }, ServiceLifetime.Transient);
  90. services.AddSingleton<TableSimple1DataAccess>();
  91. ServiceProvider = services.BuildServiceProvider();
  92. Luticate2UnitTestsContext = ServiceProvider.GetService<luticate2_unit_testsContext>();
  93. Luticate2UnitTestsContext.table_simple_1.RemoveRange(Luticate2UnitTestsContext.table_simple_1);
  94. Luticate2UnitTestsContext.SaveChanges();
  95. }
  96. public void Dispose()
  97. {
  98. Luticate2UnitTestsContext.table_simple_1.RemoveRange(Luticate2UnitTestsContext.table_simple_1);
  99. Luticate2UnitTestsContext.SaveChanges();
  100. }
  101. protected void AddTableSimple1DataSet1()
  102. {
  103. Luticate2UnitTestsContext.table_simple_1.AddRange(new table_simple_1
  104. {
  105. name = "test2",
  106. priority = 24,
  107. comment = null,
  108. optional_int = 1,
  109. created_at = DateTime.Now,
  110. updated_at = null
  111. }, new table_simple_1
  112. {
  113. name = "test1",
  114. priority = 42,
  115. comment = null,
  116. optional_int = null,
  117. created_at = DateTime.Now,
  118. updated_at = null
  119. });
  120. Luticate2UnitTestsContext.SaveChanges();
  121. }
  122. [Fact]
  123. public void TestSimpleReadFilter1()
  124. {
  125. AddTableSimple1DataSet1();
  126. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  127. var result = crudDataAccess.Read(LuPartialFieldsParser.Parse("*").Data, new LuPaginatedParamsDbo
  128. {
  129. Filter = new LuFilterDbo
  130. {
  131. Expression = (Expression<Func<TableSimple1Dbo, bool>>) (x => x.Name == "test1")
  132. },
  133. Page = 0,
  134. OrderBy = new LuOrderByDbo
  135. {
  136. OrderByFields = new List<LuOrderByFieldDbo>()
  137. },
  138. PerPage = 10
  139. });
  140. Assert.NotNull(result);
  141. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  142. var items = result.Data;
  143. Assert.NotNull(items);
  144. Assert.Equal(1, items.Count);
  145. Assert.NotNull(items.Data);
  146. Assert.Equal(1, items.Data.Count);
  147. var item = items.Data[0];
  148. Assert.NotNull(item);
  149. Assert.Equal("test1", item.Name);
  150. Assert.Equal(42, item.Priority);
  151. Assert.Null(item.Comment);
  152. Assert.Null(item.OptionalInt);
  153. }
  154. [Fact]
  155. public void TestSimpleReadOrderBy1()
  156. {
  157. AddTableSimple1DataSet1();
  158. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  159. var result = crudDataAccess.Read(LuPartialFieldsParser.Parse("*").Data, new LuPaginatedParamsDbo
  160. {
  161. Filter = new LuFilterDbo
  162. {
  163. Expression = (Expression<Func<TableSimple1Dbo, bool>>) (x => x.Name == "test1" || x.Name == "test2")
  164. },
  165. Page = 0,
  166. OrderBy = new LuOrderByDbo
  167. {
  168. OrderByFields = new List<LuOrderByFieldDbo>
  169. {
  170. new LuOrderByFieldDbo
  171. {
  172. Asc = true,
  173. Expression = (Expression<Func<TableSimple1Dbo, object>>) (x => x.Priority)
  174. }
  175. }
  176. },
  177. PerPage = 10
  178. });
  179. Assert.NotNull(result);
  180. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  181. var items = result.Data;
  182. Assert.NotNull(items);
  183. Assert.Equal(2, items.Count);
  184. Assert.NotNull(items.Data);
  185. Assert.Equal(2, items.Data.Count);
  186. var item = items.Data[0];
  187. Assert.NotNull(item);
  188. Assert.Equal("test2", item.Name);
  189. Assert.Equal(24, item.Priority);
  190. Assert.Null(item.Comment);
  191. Assert.Equal(1, item.OptionalInt);
  192. item = items.Data[1];
  193. Assert.NotNull(item);
  194. Assert.Equal("test1", item.Name);
  195. Assert.Equal(42, item.Priority);
  196. Assert.Null(item.Comment);
  197. Assert.Null(item.OptionalInt);
  198. }
  199. [Fact]
  200. public void TestSimpleReadOrderBy2()
  201. {
  202. AddTableSimple1DataSet1();
  203. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  204. var partialResponse = new LuPartialFieldsDbo
  205. {
  206. Fields = new List<LuFieldDbo>
  207. {
  208. new LuFieldDbo
  209. {
  210. Parts = new List<string>
  211. {
  212. "*"
  213. }
  214. }
  215. }
  216. };
  217. var paginationParams = new LuPaginatedParamsDbo
  218. {
  219. Filter = new LuFilterDbo
  220. {
  221. Expression = (Expression<Func<TableSimple1Dbo, bool>>) (x => x.Name == "test1" || x.Name == "test2")
  222. },
  223. Page = 0,
  224. OrderBy = new LuOrderByDbo
  225. {
  226. OrderByFields = new List<LuOrderByFieldDbo>
  227. {
  228. new LuOrderByFieldDbo
  229. {
  230. Asc = false,
  231. Expression = (Expression<Func<TableSimple1Dbo, object>>) (x => x.Priority)
  232. }
  233. }
  234. },
  235. PerPage = 10
  236. };
  237. var result = crudDataAccess.Read(partialResponse, paginationParams);
  238. Assert.NotNull(result);
  239. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  240. var items = result.Data;
  241. Assert.NotNull(items);
  242. Assert.Equal(2, items.Count);
  243. Assert.NotNull(items.Data);
  244. Assert.Equal(2, items.Data.Count);
  245. var item = items.Data[0];
  246. Assert.NotNull(item);
  247. Assert.Equal("test1", item.Name);
  248. Assert.Equal(42, item.Priority);
  249. Assert.Null(item.Comment);
  250. Assert.Null(item.OptionalInt);
  251. item = items.Data[1];
  252. Assert.NotNull(item);
  253. Assert.Equal("test2", item.Name);
  254. Assert.Equal(24, item.Priority);
  255. Assert.Null(item.Comment);
  256. Assert.Equal(1, item.OptionalInt);
  257. }
  258. [Fact]
  259. public void TestSimpleCreate1()
  260. {
  261. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  262. var partialInput = new LuPartialFieldsDbo
  263. {
  264. Fields = new List<LuFieldDbo>
  265. {
  266. new LuFieldDbo
  267. {
  268. Parts = new List<string>
  269. {
  270. "*"
  271. }
  272. }
  273. }
  274. };
  275. var partialResponse = new LuPartialFieldsDbo
  276. {
  277. Fields = new List<LuFieldDbo>
  278. {
  279. new LuFieldDbo
  280. {
  281. Parts = new List<string>
  282. {
  283. "*"
  284. }
  285. }
  286. }
  287. };
  288. var objects = new List<TableSimple1Dbo>
  289. {
  290. new TableSimple1Dbo
  291. {
  292. Name = "test2",
  293. Priority = 24,
  294. Comment = null,
  295. OptionalInt = 1,
  296. CreatedAt = DateTime.Now,
  297. UpdatedAt = null
  298. }, new TableSimple1Dbo
  299. {
  300. Name = "test1",
  301. Priority = 42,
  302. Comment = null,
  303. OptionalInt = null,
  304. CreatedAt = DateTime.Now,
  305. UpdatedAt = null
  306. }
  307. };
  308. var result = crudDataAccess.Create(partialResponse, partialInput, objects);
  309. Assert.NotNull(result);
  310. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  311. var items = result.Data;
  312. Assert.NotNull(items);
  313. Assert.Equal(objects.Count, items.Count);
  314. foreach (var o in items.Zip(objects, (added, origin) => new { Added = added, Origin = origin }))
  315. {
  316. Assert.NotNull(o.Added);
  317. Assert.Equal(o.Origin.Name, o.Added.Name);
  318. Assert.Equal(o.Origin.Priority, o.Added.Priority);
  319. Assert.Equal(o.Origin.Comment, o.Added.Comment);
  320. Assert.Equal(o.Origin.OptionalInt, o.Added.OptionalInt);
  321. }
  322. }
  323. [Fact]
  324. public void TestSimpleCreate2()
  325. {
  326. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  327. var partialInput = new LuPartialFieldsDbo
  328. {
  329. Fields = new List<LuFieldDbo>
  330. {
  331. new LuFieldDbo
  332. {
  333. Parts = new List<string>
  334. {
  335. "*"
  336. }
  337. }
  338. }
  339. };
  340. var partialResponse = new LuPartialFieldsDbo
  341. {
  342. Fields = new List<LuFieldDbo>
  343. {
  344. new LuFieldDbo
  345. {
  346. Parts = new List<string>
  347. {
  348. "id"
  349. }
  350. },
  351. new LuFieldDbo
  352. {
  353. Parts = new List<string>
  354. {
  355. "name"
  356. }
  357. }
  358. }
  359. };
  360. var objects = new List<TableSimple1Dbo>
  361. {
  362. new TableSimple1Dbo
  363. {
  364. Name = "test2",
  365. Priority = 24,
  366. Comment = null,
  367. OptionalInt = 1,
  368. CreatedAt = DateTime.Now,
  369. UpdatedAt = null
  370. }, new TableSimple1Dbo
  371. {
  372. Name = "test1",
  373. Priority = 42,
  374. Comment = null,
  375. OptionalInt = null,
  376. CreatedAt = DateTime.Now,
  377. UpdatedAt = null
  378. }
  379. };
  380. var result = crudDataAccess.Create(partialResponse, partialInput, objects);
  381. Assert.NotNull(result);
  382. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  383. var items = result.Data;
  384. Assert.NotNull(items);
  385. Assert.Equal(objects.Count, items.Count);
  386. foreach (var o in items.Zip(objects, (added, origin) => new { Added = added, Origin = origin }))
  387. {
  388. Assert.NotNull(o.Added);
  389. Assert.Equal(o.Origin.Name, o.Added.Name);
  390. Assert.Equal(0, o.Added.Priority);
  391. Assert.Null(o.Added.Comment);
  392. Assert.Null(o.Added.OptionalInt);
  393. }
  394. }
  395. [Fact]
  396. public void TestSimpleDelete1()
  397. {
  398. AddTableSimple1DataSet1();
  399. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  400. var partialResponse = new LuPartialFieldsDbo
  401. {
  402. Fields = new List<LuFieldDbo>
  403. {
  404. new LuFieldDbo
  405. {
  406. Parts = new List<string>
  407. {
  408. "*"
  409. }
  410. }
  411. }
  412. };
  413. var paginationParams = new LuPaginatedParamsDbo
  414. {
  415. Filter = new LuFilterDbo
  416. {
  417. Expression = (Expression<Func<TableSimple1Dbo, bool>>) (x => x.Name == "test1")
  418. },
  419. Page = 0,
  420. OrderBy = new LuOrderByDbo
  421. {
  422. OrderByFields = new List<LuOrderByFieldDbo>
  423. {
  424. new LuOrderByFieldDbo
  425. {
  426. Asc = false,
  427. Expression = (Expression<Func<TableSimple1Dbo, object>>) (x => x.Name)
  428. }
  429. }
  430. },
  431. PerPage = 10
  432. };
  433. var result = crudDataAccess.Delete(partialResponse, paginationParams);
  434. Assert.NotNull(result);
  435. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  436. var items = result.Data;
  437. Assert.NotNull(items);
  438. Assert.Equal(1, items.Count);
  439. var item = items.Data[0];
  440. Assert.NotNull(item);
  441. Assert.Equal("test1", item.Name);
  442. Assert.Equal(42, item.Priority);
  443. Assert.Null(item.Comment);
  444. Assert.Null(item.OptionalInt);
  445. }
  446. [Fact]
  447. public void TestSimpleDelete2()
  448. {
  449. AddTableSimple1DataSet1();
  450. var crudDataAccess = ServiceProvider.GetRequiredService<TableSimple1DataAccess>();
  451. var partialResponse = new LuPartialFieldsDbo
  452. {
  453. Fields = new List<LuFieldDbo>
  454. {
  455. new LuFieldDbo
  456. {
  457. Parts = new List<string>
  458. {
  459. "*"
  460. }
  461. }
  462. }
  463. };
  464. var paginationParams = new LuPaginatedParamsDbo
  465. {
  466. Filter = new LuFilterDbo
  467. {
  468. Expression = (Expression<Func<TableSimple1Dbo, bool>>) (x => x.Name == "test1" || x.Name == "test2")
  469. },
  470. Page = 0,
  471. OrderBy = new LuOrderByDbo
  472. {
  473. OrderByFields = new List<LuOrderByFieldDbo>
  474. {
  475. new LuOrderByFieldDbo
  476. {
  477. Asc = false,
  478. Expression = (Expression<Func<TableSimple1Dbo, object>>) (x => x.Name)
  479. }
  480. }
  481. },
  482. PerPage = 10
  483. };
  484. var result = crudDataAccess.Delete(partialResponse, paginationParams);
  485. Assert.NotNull(result);
  486. Assert.Equal(LuStatus.Success.ToInt(), result.Status);
  487. var items = result.Data;
  488. Assert.NotNull(items);
  489. Assert.Equal(2, items.Count);
  490. var item = items.Data[0];
  491. Assert.NotNull(item);
  492. Assert.Equal("test2", item.Name);
  493. Assert.Equal(24, item.Priority);
  494. Assert.Null(item.Comment);
  495. Assert.Equal(1, item.OptionalInt);
  496. item = items.Data[1];
  497. Assert.NotNull(item);
  498. Assert.Equal("test1", item.Name);
  499. Assert.Equal(42, item.Priority);
  500. Assert.Null(item.Comment);
  501. Assert.Null(item.OptionalInt);
  502. }
  503. }
  504. }