| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using DotNet.Testcontainers.Builders;
- using DotNet.Testcontainers.Containers;
- using Microsoft.Playwright;
- namespace Tests.E2e;
- public class PlaywrightFixture : IAsyncLifetime
- {
- public IBrowser Browser { get; private set; } = default!;
- public string BaseUrl { get; private set; } = default!;
- private IPlaywright _playwright = default!;
- private IContainer _container = default!;
- private string _configDirectory = default!;
- // Change this if needed
- private const string DockerImage = "rackpeek:ci";
- public async Task InitializeAsync()
- {
- // Create isolated config directory per test run
- _configDirectory = Path.Combine(
- Path.GetTempPath(),
- "rackpeek-e2e",
- Guid.NewGuid().ToString());
- Directory.CreateDirectory(_configDirectory);
- File.WriteAllText(
- Path.Combine(_configDirectory, "config.yaml"),
- "# E2E test config");
- _container = new ContainerBuilder()
- .WithImage(DockerImage)
- .WithPortBinding(8080, true) // random host port
- .WithBindMount(_configDirectory, "/app/config")
- .WithWaitStrategy(
- Wait.ForUnixContainer()
- .UntilHttpRequestIsSucceeded(r => r
- .ForPort(8080)
- .ForPath("/")))
- .Build();
- await _container.StartAsync();
- var mappedPort = _container.GetMappedPublicPort(8080);
- BaseUrl = $"http://127.0.0.1:{mappedPort}";
- Console.WriteLine($"RackPeek running at: {BaseUrl}");
- _playwright = await Playwright.CreateAsync();
- Browser = await _playwright.Chromium.LaunchAsync(new()
- {
- //Headless = true
- Headless = false,
- SlowMo = 200
- });
- }
- public async Task DisposeAsync()
- {
- if (Browser != null)
- await Browser.DisposeAsync();
- _playwright?.Dispose();
- if (_container != null)
- await _container.DisposeAsync();
- if (!string.IsNullOrWhiteSpace(_configDirectory) &&
- Directory.Exists(_configDirectory))
- {
- Directory.Delete(_configDirectory, true);
- }
- }
- }
|