From 96eab1d7ffe744855e47b6e7468059ab012f2e7a Mon Sep 17 00:00:00 2001 From: "Marcelo M. Maciel" <4993482+marcelo-maciel@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:58:24 -0300 Subject: [PATCH 1/2] docs(testing): MinIO containers come from quay.io MinIO withdrew `minio/minio` from Docker Hub, so the kit pulls the same image from `quay.io/minio/minio` instead. Updates the two testing pages that name the image and adds a changelog entry with the action for deployments that pinned it themselves. Pairs with dotnet-starter-kit#1388. --- src/content/docs/changelog/index.mdx | 6 +++++- src/content/docs/testing/fixtures-and-seed-data.mdx | 4 ++-- src/content/docs/testing/integration-tests.mdx | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/content/docs/changelog/index.mdx b/src/content/docs/changelog/index.mdx index 411e58d4..7feb015f 100644 --- a/src/content/docs/changelog/index.mdx +++ b/src/content/docs/changelog/index.mdx @@ -1,6 +1,6 @@ --- title: Overview -lastUpdated: 2026-07-13 +lastUpdated: 2026-09-14 description: Release notes and version history for fullstackhero. sidebar: order: 1 @@ -11,6 +11,10 @@ seo: Notable changes to the kit, newest first. +## 2026-09-14 + +- **MinIO now comes from quay.io instead of Docker Hub.** MinIO withdrew `minio/minio` from Docker Hub: the repository is gone, and a pull fails with `pull access denied for minio/minio, repository does not exist or may require 'docker login'`. That broke everything in the kit that boots MinIO - the Testcontainers integration-test harness (every test in the project fails at container start), the Aspire AppHost, and the Docker Compose deployment under `deploy/docker/`. The image is still published at `quay.io/minio/minio`, so only the registry changes. **Action for deployments:** if you copied the compose file or pinned `minio/minio` anywhere of your own, repoint it at `quay.io/minio/minio`. Nothing else changes; it is the same image. + ## 2026-07-13 - **Dashboard: tenants can now edit their own branding from Settings.** A new **Settings → Branding** tab lets a tenant admin holding `Tenants.UpdateTheme` customise their **light and dark palettes** and **brand asset URLs** (logo, dark-mode logo, favicon) with a live preview - mirroring the operator's existing tenant-branding card, but self-service and with no `tenant:` header, since the theme endpoints are already scoped to the current tenant. The tab renders only for holders of that permission; a direct-URL visit without it hits the API's `403`, surfaced as an error band. Editing is draft-based - a **Reset to defaults** action and per-palette reset are available, and unsaved edits are preserved while you work (a co-admin's concurrent change appears on a manual refresh rather than overwriting your form). diff --git a/src/content/docs/testing/fixtures-and-seed-data.mdx b/src/content/docs/testing/fixtures-and-seed-data.mdx index 0c55cc0f..518a9bc5 100644 --- a/src/content/docs/testing/fixtures-and-seed-data.mdx +++ b/src/content/docs/testing/fixtures-and-seed-data.mdx @@ -1,6 +1,6 @@ --- title: Fixtures & seed data -lastUpdated: 2026-06-11 +lastUpdated: 2026-09-14 description: The shared test factory (containers, host, seeded root tenant + admin) used across the integration suite, and the service swaps that keep tests deterministic. sidebar: label: Fixtures & seed data @@ -22,7 +22,7 @@ The whole suite shares one database across hundreds of tests. Give everything yo | Piece | Type | Role | |---|---|---| -| `FshWebApplicationFactory` | `WebApplicationFactory, IAsyncLifetime` | Owns the `postgres:17-alpine` + `minio/minio:latest` Testcontainers, builds the in-process host, migrates + seeds | +| `FshWebApplicationFactory` | `WebApplicationFactory, IAsyncLifetime` | Owns the `postgres:17-alpine` + `quay.io/minio/minio:latest` Testcontainers, builds the in-process host, migrates + seeds | | `FshCollectionDefinition` | `ICollectionFixture` | Shares **one** factory instance across the whole suite (`[Collection(FshCollectionDefinition.Name)]`) | | `AuthHelper` | Plain class, wraps the factory | Issues real tokens via `POST /token/issue` and builds authenticated `HttpClient`s | | `TestConstants` | Static class | Root tenant id, root admin credentials, JWT settings, per-module base paths | diff --git a/src/content/docs/testing/integration-tests.mdx b/src/content/docs/testing/integration-tests.mdx index bf11e368..f71b6457 100644 --- a/src/content/docs/testing/integration-tests.mdx +++ b/src/content/docs/testing/integration-tests.mdx @@ -1,6 +1,6 @@ --- title: Integration tests -lastUpdated: 2026-06-11 +lastUpdated: 2026-09-14 description: WebApplicationFactory in-process API tests against Testcontainers Postgres + MinIO - one container set, all modules, real round trips. sidebar: label: Integration tests @@ -23,7 +23,7 @@ Splitting integration tests into per-module projects would mean per-project cont | Layer | Library | Purpose | |---|---|---| | Host | `Microsoft.AspNetCore.Mvc.Testing` | `WebApplicationFactory` for the in-process API | -| Containers | `Testcontainers.PostgreSql` / `Testcontainers.Minio` 4.11 | `postgres:17-alpine` + `minio/minio:latest` per test run | +| Containers | `Testcontainers.PostgreSql` / `Testcontainers.Minio` 4.11 | `postgres:17-alpine` + `quay.io/minio/minio:latest` per test run | | HTTP | `HttpClient` from `factory.CreateClient()` | Real HTTP calls through the full middleware pipeline | | Assertions | Shouldly, NSubstitute, AutoFixture | Same as unit tests | From 0f0377dcfa5c30b7cff243852c39485ac954e90c Mon Sep 17 00:00:00 2001 From: "Marcelo M. Maciel" <4993482+marcelo-maciel@users.noreply.github.com> Date: Mon, 14 Sep 2026 13:23:48 -0300 Subject: [PATCH 2/2] docs(testing): pin the MinIO tag and note the Testcontainers bump quay has not moved the floating latest tag since September 2025, so the kit pins RELEASE.2025-09-07T16-13-09Z rather than following it. Records the Testcontainers 4.11.0 to 4.14.0 bump that clears the SSH.NET advisory, and the version shown on the integration-tests page. --- src/content/docs/changelog/index.mdx | 4 +++- src/content/docs/testing/fixtures-and-seed-data.mdx | 2 +- src/content/docs/testing/integration-tests.mdx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/content/docs/changelog/index.mdx b/src/content/docs/changelog/index.mdx index 7feb015f..94b95312 100644 --- a/src/content/docs/changelog/index.mdx +++ b/src/content/docs/changelog/index.mdx @@ -13,7 +13,9 @@ Notable changes to the kit, newest first. ## 2026-09-14 -- **MinIO now comes from quay.io instead of Docker Hub.** MinIO withdrew `minio/minio` from Docker Hub: the repository is gone, and a pull fails with `pull access denied for minio/minio, repository does not exist or may require 'docker login'`. That broke everything in the kit that boots MinIO - the Testcontainers integration-test harness (every test in the project fails at container start), the Aspire AppHost, and the Docker Compose deployment under `deploy/docker/`. The image is still published at `quay.io/minio/minio`, so only the registry changes. **Action for deployments:** if you copied the compose file or pinned `minio/minio` anywhere of your own, repoint it at `quay.io/minio/minio`. Nothing else changes; it is the same image. +- **MinIO now comes from quay.io instead of Docker Hub.** MinIO withdrew `minio/minio` from Docker Hub: the repository is gone, and a pull fails with `pull access denied for minio/minio, repository does not exist or may require 'docker login'`. That broke everything in the kit that boots MinIO - the Testcontainers integration-test harness (every test in the project fails at container start), the Aspire AppHost, and the Docker Compose deployment under `deploy/docker/`. The image is still published at `quay.io/minio/minio`, and the kit now pins an explicit tag, `RELEASE.2025-09-07T16-13-09Z`, instead of `:latest` - quay has not moved `:latest` since September 2025, so the two resolve to the same digest today and the pin only removes the surprise of a silent move later. **Action for deployments:** if you copied the compose file or pinned `minio/minio` anywhere of your own, repoint it at `quay.io/minio/minio` with that tag. It is the same image; nothing else changes. + +- **The `Testcontainers.*` packages move 4.11.0 to 4.14.0.** 4.11.0 depends on `SSH.NET` 2025.1.0, which carries GHSA-q939-rpr3-3284 and fails `dotnet restore` for the whole solution under `TreatWarningsAsErrors`. 4.14.0 already depends on the patched `SSH.NET` 2026.0.0. Test-only; no runtime surface moves. ## 2026-07-13 diff --git a/src/content/docs/testing/fixtures-and-seed-data.mdx b/src/content/docs/testing/fixtures-and-seed-data.mdx index 518a9bc5..8f57fa1e 100644 --- a/src/content/docs/testing/fixtures-and-seed-data.mdx +++ b/src/content/docs/testing/fixtures-and-seed-data.mdx @@ -22,7 +22,7 @@ The whole suite shares one database across hundreds of tests. Give everything yo | Piece | Type | Role | |---|---|---| -| `FshWebApplicationFactory` | `WebApplicationFactory, IAsyncLifetime` | Owns the `postgres:17-alpine` + `quay.io/minio/minio:latest` Testcontainers, builds the in-process host, migrates + seeds | +| `FshWebApplicationFactory` | `WebApplicationFactory, IAsyncLifetime` | Owns the `postgres:17-alpine` + `quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z` Testcontainers, builds the in-process host, migrates + seeds | | `FshCollectionDefinition` | `ICollectionFixture` | Shares **one** factory instance across the whole suite (`[Collection(FshCollectionDefinition.Name)]`) | | `AuthHelper` | Plain class, wraps the factory | Issues real tokens via `POST /token/issue` and builds authenticated `HttpClient`s | | `TestConstants` | Static class | Root tenant id, root admin credentials, JWT settings, per-module base paths | diff --git a/src/content/docs/testing/integration-tests.mdx b/src/content/docs/testing/integration-tests.mdx index f71b6457..10d97f42 100644 --- a/src/content/docs/testing/integration-tests.mdx +++ b/src/content/docs/testing/integration-tests.mdx @@ -23,7 +23,7 @@ Splitting integration tests into per-module projects would mean per-project cont | Layer | Library | Purpose | |---|---|---| | Host | `Microsoft.AspNetCore.Mvc.Testing` | `WebApplicationFactory` for the in-process API | -| Containers | `Testcontainers.PostgreSql` / `Testcontainers.Minio` 4.11 | `postgres:17-alpine` + `quay.io/minio/minio:latest` per test run | +| Containers | `Testcontainers.PostgreSql` / `Testcontainers.Minio` 4.14 | `postgres:17-alpine` + `quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z` per test run | | HTTP | `HttpClient` from `factory.CreateClient()` | Real HTTP calls through the full middleware pipeline | | Assertions | Shouldly, NSubstitute, AutoFixture | Same as unit tests |