PlaywrightFixture.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using DotNet.Testcontainers.Builders;
  2. using DotNet.Testcontainers.Containers;
  3. using Microsoft.Playwright;
  4. namespace Tests.E2e.Infra;
  5. public class PlaywrightFixture : IAsyncLifetime
  6. {
  7. // Change this if needed
  8. private const string DockerImage = "rackpeek:ci";
  9. private string _configDirectory = default!;
  10. private IContainer _container = default!;
  11. private IPlaywright _playwright = default!;
  12. public IBrowser Browser { get; private set; } = default!;
  13. public string BaseUrl { get; private set; } = default!;
  14. public async Task InitializeAsync()
  15. {
  16. // Create isolated config directory per test run
  17. _configDirectory = Path.Combine(
  18. Path.GetTempPath(),
  19. "rackpeek-e2e",
  20. Guid.NewGuid().ToString());
  21. Directory.CreateDirectory(_configDirectory);
  22. File.WriteAllText(
  23. Path.Combine(_configDirectory, "config.yaml"),
  24. "# E2E test config");
  25. _container = new ContainerBuilder()
  26. .WithImage(DockerImage)
  27. .WithPortBinding(8080, true) // random host port
  28. .WithBindMount(_configDirectory, "/app/config")
  29. .WithWaitStrategy(
  30. Wait.ForUnixContainer()
  31. .UntilHttpRequestIsSucceeded(r => r
  32. .ForPort(8080)
  33. .ForPath("/")))
  34. .Build();
  35. await _container.StartAsync();
  36. var mappedPort = _container.GetMappedPublicPort(8080);
  37. BaseUrl = $"http://127.0.0.1:{mappedPort}";
  38. Console.WriteLine($"RackPeek running at: {BaseUrl}");
  39. _playwright = await Playwright.CreateAsync();
  40. Browser = await _playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
  41. {
  42. Headless = true,
  43. //Headless = false,
  44. SlowMo = 500,
  45. Args = new[]
  46. {
  47. "--disable-dev-shm-usage",
  48. "--no-sandbox"
  49. }
  50. });
  51. Assertions.SetDefaultExpectTimeout(15000);
  52. }
  53. public async Task DisposeAsync()
  54. {
  55. if (Browser != null)
  56. await Browser.DisposeAsync();
  57. _playwright?.Dispose();
  58. if (_container != null)
  59. await _container.DisposeAsync();
  60. if (!string.IsNullOrWhiteSpace(_configDirectory) &&
  61. Directory.Exists(_configDirectory))
  62. Directory.Delete(_configDirectory, true);
  63. }
  64. }