您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

97 行
2.9KB

  1. using CartWise.Application.Services;
  2. using CartWise.Domain.Entities;
  3. using CartWise.Domain.Enums;
  4. using CartWise.Infrastructure.Data;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace CartWise.Application.Tests;
  7. public class ProductServiceTests : IDisposable
  8. {
  9. private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc);
  10. private readonly CartWiseDbContext _db;
  11. private readonly ProductService _sut;
  12. public ProductServiceTests()
  13. {
  14. var options = new DbContextOptionsBuilder<CartWiseDbContext>()
  15. .UseInMemoryDatabase(Guid.NewGuid().ToString())
  16. .Options;
  17. _db = new CartWiseDbContext(options);
  18. _sut = new ProductService(_db);
  19. }
  20. public void Dispose()
  21. {
  22. _db.Dispose();
  23. GC.SuppressFinalize(this);
  24. }
  25. [Fact]
  26. public async Task SearchAsync_ReturnsMatchingProductsWithBrandName()
  27. {
  28. var brand = new Brand("Jif");
  29. var product = new Product("Jif Creamy Peanut Butter", ProductSourceType.Manual, Now, brandId: brand.BrandId, sizeValue: 16m, sizeUnit: "oz");
  30. _db.Brands.Add(brand);
  31. _db.Products.Add(product);
  32. await _db.SaveChangesAsync();
  33. var results = await _sut.SearchAsync("peanut");
  34. var result = Assert.Single(results);
  35. Assert.Equal("Jif Creamy Peanut Butter", result.Name);
  36. Assert.Equal("Jif", result.BrandName);
  37. Assert.Equal("16 oz", result.PackageDisplay);
  38. }
  39. [Fact]
  40. public async Task SearchAsync_ReturnsEmptyForBlankQuery()
  41. {
  42. var results = await _sut.SearchAsync(" ");
  43. Assert.Empty(results);
  44. }
  45. [Fact]
  46. public async Task SearchAsync_ReturnsEmptyWhenNothingMatches()
  47. {
  48. _db.Products.Add(new Product("Whole Milk", ProductSourceType.Manual, Now));
  49. await _db.SaveChangesAsync();
  50. var results = await _sut.SearchAsync("cereal");
  51. Assert.Empty(results);
  52. }
  53. [Fact]
  54. public async Task GetDetailsAsync_ReturnsNullWhenProductDoesNotExist()
  55. {
  56. var details = await _sut.GetDetailsAsync(Guid.NewGuid());
  57. Assert.Null(details);
  58. }
  59. [Fact]
  60. public async Task GetDetailsAsync_ReturnsBrandConceptAndIdentifiers()
  61. {
  62. var brand = new Brand("Jif");
  63. var concept = new GroceryConcept("Peanut Butter", Now);
  64. var product = new Product("Jif Creamy 16 oz", ProductSourceType.Manual, Now, groceryConceptId: concept.GroceryConceptId, brandId: brand.BrandId);
  65. product.AddIdentifier(ProductIdentifierType.UpcA, "051500255516");
  66. _db.Brands.Add(brand);
  67. _db.GroceryConcepts.Add(concept);
  68. _db.Products.Add(product);
  69. await _db.SaveChangesAsync();
  70. var details = await _sut.GetDetailsAsync(product.ProductId);
  71. Assert.NotNull(details);
  72. Assert.Equal("Jif", details!.BrandName);
  73. Assert.Equal("Peanut Butter", details.ConceptName);
  74. Assert.Equal("051500255516", Assert.Single(details.BarcodeIdentifiers));
  75. }
  76. }

Powered by TurnKey Linux.