Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

95 lignes
3.0KB

  1. using System.Net;
  2. using CartWise.Infrastructure.Integrations.OpenFoodFacts;
  3. using Microsoft.Extensions.Logging.Abstractions;
  4. namespace CartWise.Application.Tests;
  5. public class OpenFoodFactsProductDataProviderTests
  6. {
  7. [Fact]
  8. public async Task FindByBarcodeAsync_ReturnsMappedResultWhenFound()
  9. {
  10. const string json = """
  11. {
  12. "status": 1,
  13. "product": {
  14. "product_name": "Peanut Butter",
  15. "brands": "Jif, Some Co-Brand",
  16. "quantity": "16 oz",
  17. "image_url": "https://example.com/image.jpg",
  18. "code": "051500255516"
  19. }
  20. }
  21. """;
  22. var provider = CreateProvider(HttpStatusCode.OK, json);
  23. var result = await provider.FindByBarcodeAsync("051500255516");
  24. Assert.NotNull(result);
  25. Assert.Equal("Peanut Butter", result!.Name);
  26. Assert.Equal("Jif", result.BrandName);
  27. Assert.Equal(16m, result.SizeValue);
  28. Assert.Equal("oz", result.SizeUnit);
  29. Assert.Equal("051500255516", result.SourceExternalId);
  30. }
  31. [Fact]
  32. public async Task FindByBarcodeAsync_ReturnsNullWhenStatusIsNotFound()
  33. {
  34. const string json = """{ "status": 0 }""";
  35. var provider = CreateProvider(HttpStatusCode.OK, json);
  36. var result = await provider.FindByBarcodeAsync("000000000000");
  37. Assert.Null(result);
  38. }
  39. [Fact]
  40. public async Task FindByBarcodeAsync_ReturnsNullOnHttpFailure()
  41. {
  42. var provider = CreateProvider(HttpStatusCode.InternalServerError, "error");
  43. var result = await provider.FindByBarcodeAsync("051500255516");
  44. Assert.Null(result);
  45. }
  46. [Fact]
  47. public async Task FindByBarcodeAsync_ReturnsNullOnMalformedJson()
  48. {
  49. var provider = CreateProvider(HttpStatusCode.OK, "{not valid json");
  50. var result = await provider.FindByBarcodeAsync("051500255516");
  51. Assert.Null(result);
  52. }
  53. private static OpenFoodFactsProductDataProvider CreateProvider(HttpStatusCode statusCode, string content)
  54. {
  55. var handler = new FakeHttpMessageHandler(statusCode, content);
  56. var httpClient = new HttpClient(handler) { BaseAddress = new Uri("https://off.example.com/") };
  57. return new OpenFoodFactsProductDataProvider(httpClient, NullLogger<OpenFoodFactsProductDataProvider>.Instance);
  58. }
  59. private sealed class FakeHttpMessageHandler : HttpMessageHandler
  60. {
  61. private readonly HttpStatusCode _statusCode;
  62. private readonly string _content;
  63. public FakeHttpMessageHandler(HttpStatusCode statusCode, string content)
  64. {
  65. _statusCode = statusCode;
  66. _content = content;
  67. }
  68. protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  69. {
  70. var response = new HttpResponseMessage(_statusCode)
  71. {
  72. Content = new StringContent(_content)
  73. };
  74. return Task.FromResult(response);
  75. }
  76. }
  77. }

Powered by TurnKey Linux.