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
4.0KB

  1. using System.Net;
  2. using Microsoft.AspNetCore.Mvc.Testing;
  3. namespace CartWise.Web.Tests;
  4. public class PurchaseAccessControlTests : IClassFixture<CartWiseWebApplicationFactory>
  5. {
  6. private readonly CartWiseWebApplicationFactory _factory;
  7. public PurchaseAccessControlTests(CartWiseWebApplicationFactory factory)
  8. {
  9. _factory = factory;
  10. }
  11. [Fact]
  12. public async Task AnonymousUser_IsRedirectedToLoginWhenRequestingPurchases()
  13. {
  14. var client = _factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false });
  15. var response = await client.GetAsync("/purchases");
  16. Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
  17. Assert.Contains("/Account/Login", response.Headers.Location?.ToString());
  18. }
  19. [Fact]
  20. public async Task RecordPurchase_FullFlow_AddsItemAndCompletes()
  21. {
  22. var client = _factory.CreateClient();
  23. await WebTestHelpers.RegisterAsync(client, "purchaseflow1@example.com", "Purchase Flow User");
  24. await WebTestHelpers.CreateHouseholdAsync(client, "Purchase Flow Household");
  25. var indexHtml = await client.GetStringAsync("/purchases");
  26. var startToken = WebTestHelpers.ExtractAntiForgeryToken(indexHtml);
  27. var startResponse = await client.PostAsync("/purchases/start", new FormUrlEncodedContent(new Dictionary<string, string>
  28. {
  29. ["__RequestVerificationToken"] = startToken
  30. }));
  31. startResponse.EnsureSuccessStatusCode();
  32. var purchaseUrl = startResponse.RequestMessage!.RequestUri!.AbsolutePath;
  33. var detailHtml = await client.GetStringAsync(purchaseUrl);
  34. HtmlAssert.Contains("In progress", detailHtml);
  35. var itemToken = WebTestHelpers.ExtractAntiForgeryToken(detailHtml);
  36. var addItemResponse = await client.PostAsync($"{purchaseUrl}/items", new FormUrlEncodedContent(new Dictionary<string, string>
  37. {
  38. ["__RequestVerificationToken"] = itemToken,
  39. ["NewItem.Description"] = "Milk",
  40. ["NewItem.Quantity"] = "2",
  41. ["NewItem.Unit"] = "gal",
  42. ["NewItem.LinePrice"] = "7.98"
  43. }));
  44. addItemResponse.EnsureSuccessStatusCode();
  45. var afterAddHtml = await addItemResponse.Content.ReadAsStringAsync();
  46. HtmlAssert.Contains("Milk", afterAddHtml);
  47. var completeToken = WebTestHelpers.ExtractAntiForgeryToken(afterAddHtml);
  48. var completeResponse = await client.PostAsync($"{purchaseUrl}/complete", new FormUrlEncodedContent(new Dictionary<string, string>
  49. {
  50. ["__RequestVerificationToken"] = completeToken
  51. }));
  52. completeResponse.EnsureSuccessStatusCode();
  53. var finalHtml = await completeResponse.Content.ReadAsStringAsync();
  54. HtmlAssert.Contains("Completed", finalHtml);
  55. HtmlAssert.Contains("$7.98", finalHtml);
  56. }
  57. [Fact]
  58. public async Task EachHousehold_OnlySeesItsOwnPurchases()
  59. {
  60. var clientA = _factory.CreateClient();
  61. var clientB = _factory.CreateClient();
  62. await WebTestHelpers.RegisterAsync(clientA, "purchasealice@example.com", "Purchase Alice");
  63. await WebTestHelpers.RegisterAsync(clientB, "purchasebob@example.com", "Purchase Bob");
  64. await WebTestHelpers.CreateHouseholdAsync(clientA, "Purchase Household A");
  65. await WebTestHelpers.CreateHouseholdAsync(clientB, "Purchase Household B");
  66. var indexA = await clientA.GetStringAsync("/purchases");
  67. var tokenA = WebTestHelpers.ExtractAntiForgeryToken(indexA);
  68. var startResponseA = await clientA.PostAsync("/purchases/start", new FormUrlEncodedContent(new Dictionary<string, string>
  69. {
  70. ["__RequestVerificationToken"] = tokenA
  71. }));
  72. var purchaseUrlA = startResponseA.RequestMessage!.RequestUri!.AbsolutePath;
  73. var purchaseIdA = purchaseUrlA.Split('/').Last();
  74. var response = await clientB.GetAsync($"/purchases/{purchaseIdA}");
  75. Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
  76. }
  77. }

Powered by TurnKey Linux.