Selenium-driven UI tests don't run reliably on Linux; the UI tests in
FirstUIStript.cs were flaky and time-consuming without catching real
regressions. The maintained UI going forward is PostIt, which is tested
via its own PostIt.Tests project.
Removed:
- src/Yavsc.Org.Tests/FirstUIStript.cs (the Selenium-based FirstScript class)
- Selenium.WebDriver PackageReference from Yavsc.Org.Tests.csproj
- Selenium.WebDriver version from src/Yavsc.Org.Tests/Directory.Packages.props
WebServerFixture, BaseTestContext, and the integration tests that depend
on them (Remoting, Services, EMailling, etc.) are unaffected.
Move product-local package versions out of the root Directory.Packages.props
into per-product props files under src/<Product>/. The root file now only
contains versions for packages declared by two or more top-level products,
which is the actual shared set.
Each per-product Directory.Packages.props imports the root via
GetPathOfFileAbove so that the shared versions are inherited; this is
necessary because the .NET SDK picks the closest Directory.Packages.props
in the hierarchy and does not merge multiple ones.
Per-product file contents:
- src/cli/ Microsoft.AspNetCore.Razor.Language,
Microsoft.Extensions.{CommandLineUtils,Configuration,Hosting}
- src/PostIt/ Avalonia* and CommunityToolkit.Mvvm
- src/PostIt.Tests/ Avalonia.Headless{,XUnit}
- src/Yavsc.Org/ AsciiDocSharp*, Google.Apis.Compute.v1,
HigginsSoft.IdentityServer8.AspNetIdentity,
IdentityServer8.EntityFramework.Storage,
IdentityServer8.Security, IdentityServer8.Storage,
Microsoft.AspNetCore.Antiforgery, Authentication.Google,
Diagnostics.EntityFrameworkCore, Mvc.NewtonsoftJson,
SignalR, EntityFrameworkCore.Tools, Swashbuckle,
System.Security.Cryptography.Pkcs, YamlDotNet
- src/Yavsc.Org.Tests/ Microsoft.AspNetCore.Hosting,
Extensions.Caching.Memory, Options,
Options.ConfigurationExtensions,
Selenium.WebDriver, xunit.v3.{common,extensibility.core}
- src/Yavsc.Server/ Anthropic.SDK, Google.Apis.Calendar.v3,
Magick.NET-Q8-AnyCPU, MailKit, MimeKit,
Microsoft.AspNetCore.Http.Features, StaticFiles,
EntityFrameworkCore.SqlServer,
Npgsql.EntityFrameworkCore.PostgreSQL,
PayPalMerchantSDK, pazof.rules, RazorEngine.NetCore
- src/Yavsc.Web/ IdentityModel.AspNetCore
No per-product file is created for Yavsc.Api, Yavsc.Blogs, Yavsc.Abstract,
or templateWeb: Api and Blogs only declare the shared JwtBearer, Abstract
and templateWeb declare no package references at all.
Also includes a minor cosmetic update to FirstUIStript.cs (Firefox -> Chrome
driver, dedent, comment header). Tests previously failing on DataProtection
keyset / SMTP were unrelated environment issues (resolved by fixing the
SMTP password locally).
Move the integration test project from the top-level test/ directory into
src/ alongside the projects it tests. Rename the project (and folder) to
Yavsc.Org.Tests to match .NET conventions and reflect that it tests the
Org runtime primarily.
Path changes:
- test/yavscTests/yavscTests.csproj -> src/Yavsc.Org.Tests/Yavsc.Org.Tests.csproj
- All .cs / .json / .resx files moved to their new location
- PostItViewModelTests moved out to the dedicated src/PostIt.Tests project
(it was unrelated to Org testing)
Build adjustments:
- <ProjectReference> paths shortened (..\..\src\X -> ..\X)
- PostIt project reference removed (covered by its own test project)
- <OutputType>exe added (required by xunit.v3)
- xunit.v3.common and xunit.v3.extensibility.core added to package versions
Solution + sln:
- yavsc.sln Project Name updated to 'Yavsc.Org.Tests' and path updated
- GUID preserved so existing build configs stay valid
Static web assets:
- The CopyStaticWebAssetsManifest target was hard-coding the destination
filename to 'testhost.staticwebassets.endpoints.json', which worked
when the assembly was named 'yavscTests'. Now that the assembly name
is 'Yavsc.Org.Tests', ASP.NET Core's MapStaticAssets() looks for
'Yavsc.Org.Tests.staticwebassets.endpoints.json' (entry-assembly-based
resolution). Use $(MSBuildProjectName) so the copy target stays
correct under any future rename.
The Site:Audience setting was conflating two distinct concepts: an OAuth
JWT audience (a single resource identifier) and a CORS allow-list (an
array of origins). Collapsing them caused several latent bugs:
- OAuth/JWT validation expected a single string while CORS WithOrigins
accepts an array.
- Password-reset callback URLs and OAuth client RedirectUri/Origin were
being built from what was meant to be an audience identifier, not a
base URL.
- Yavsc.Org's main CORS policy was hardcoded to '*', with no way to
restrict it without code changes.
Changes:
- SiteSettings.Audience (string) replaced with CorsAllowedOrigins
(IList<string>).
- OAuth JWT Authority still reads Site:Authority; Audience now reads
Site:ExternalUrl (Org only; Api/Blogs use ValidateAudience=false).
- MailSender and AccountController build reset-callback URLs from
Site:ExternalUrl.
- ClientController uses Site:ExternalUrl for OAuth RedirectUri/Origin
defaults on newly created clients.
- Yavsc.Api and Yavsc.Blogs now read CORS origins from
Site:CorsAllowedOrigins instead of hardcoded URLs.
Add shared AddYavscCors / AddYavscJwtBearer extension methods in
Yavsc.Server/Helpers/ServiceExtensions.cs to enforce a single
configuration contract across all runtime services (Api, Blogs, Org).
Fails closed when CorsAllowedOrigins is empty; fails fast at startup
when Site:Authority is missing.
Remove obsolete ConfigurationHelpers.GetAudience (no remaining callers).
Local appsettings-*.json files (which carry deployment-specific values
and are gitignored) must be updated to add Site:CorsAllowedOrigins.
Drops 1038 files from src/Yavsc.Org/wwwroot/lib/ — they remain
on disk and are now restored via 'npm install' at build time
(see package.json and esbuild.config.mjs).
Exception: jonthornton-Datepair is not on npm, the bundled
files are kept in wwwroot/lib/jonthornton-Datepair/ as static
assets.
Also extends .gitignore to ignore:
- node_modules/, build/, package-lock.json (esbuild toolchain)
- wwwroot/js/*.min.js (regenerated by 'npm run build:js')
- .Production.env (added explicitly, not matched by '.*.env'
glob in some git versions)
This aligns themeok with the architecture already in place
on refac/js-bundle (commits ed7522c5, 196f4b0b, 292c0a2f on
that branch). The build artifacts were already present in
node_modules/ and build/ on disk; this commit only stops
tracking them.
Tested: dotnet test 11/11 green (no C# code touched).
The previous code computed the path as
Path.Combine(BaseDir, "../../src/Yavsc.Org")
which from `bin/Debug/net10.0/` resolved to a non-existent
`test/yavscTests/src/Yavsc.Org` (two levels up, not four).
Kestrel logged:
"The WebRootPath was not found: ... /wwwroot. Static files
may be unavailable."
The fix walks up the directory tree from BaseDir until it
finds a directory that contains `src/Yavsc.Org`. This is
robust against the test runner changing the current working
directory (which it does: it runs from
`test/yavscTests/bin/Debug/net10.0`, not the repo root).
After this fix, UseStaticFiles correctly resolves the
wwwroot, so static assets under `wwwroot/` are served.
Note: this does NOT make the in-memory WebServerFixture
fully functional. Two pre-existing issues remain:
1. _Layout.cshtml references `~/css/site.css` but the
actual file is now at `~/css/main/site.css` (moved by
commit 31906a78). The .cshtml was not updated.
2. HomeController.Index() throws NullReferenceException
on an empty EF Core InMemory database (no Activities
seeded). UseDeveloperExceptionPage returns a 500 page
that gets caught and re-rendered as 404 by the test
client.
Both will be addressed in follow-up commits.
Tested: dotnet test 11/11 green (existing tests use
Services DI, not HTTP). UI tests not added yet (blocked by
the issues above).
Énoncé du défi : aligner main sur l'intention trunk qui a
déjà opéré sur themeok, libérer le dépôt du code inutile,
bien nettoyer CSS/JS, sans casser le JS et le CSS de
_Layout.cshtml. Introduire immédiatement des tests d'UI
automatisés comme garde-fou.
Le document contient :
- Énoncé du défi
- État actuel des 3 branches (themeok, main, refac/js-bundle)
- Résultats du diagnostic de main (cause racine : contenu
vide + erreur JS sur carousel vide, pas un problème de
fichiers servis)
- 6 critères d'acceptation vérifiables
- Stratégie de tests UI automatisés (Playwright C#)
- Plan d'attaque en 6 étapes
- 5 risques identifiés (cache navigateur, double binding
Kestrel, .env non versionné, ports utilisés, quiproquos
de branches)
- Todo court/moyen/long terme
- Annexes : environnement d'exécution, procédure make reinstall
Le diagnostic a été reproduit en worktree diag/main sur
ports 5060/5061, en surchargeant la config Kestrel via
variables d'environnement pour ne pas écraser le service
systemd yavscOrg sur port 3002.
Chromium rejects cookies that have SameSite=None but no
Secure flag. The default Identity cookie policy uses
SameSite=None, which is invalid on http://localhost (no
TLS, no Secure). Result on http://localhost:5000:
Cookie '.AspNetCore.Identity.Application' rejected
because it has the 'SameSite=None' attribute but is
missing the 'secure' attribute.
Fix: in Development environment, configure
ConfigureApplicationCookie and ConfigureExternalCookie
to use SameSite=Lax and SameAsRequest SecurePolicy.
Lax is permissive enough for OAuth callbacks (top-level
GET navigations) and avoids the rejection.
Production (https://) is untouched — the default
SameSite=None is correct when Secure is set.
Note on the sameSiteMode reference: SameSiteMode is
defined in two namespaces
(Microsoft.AspNetCore.Http and Microsoft.Net.Http.Headers).
The file already uses 'using Microsoft.Net.Http.Headers;'
so a bare 'SameSiteMode' is ambiguous. Using the
fully-qualified name 'Microsoft.AspNetCore.Http.SameSiteMode'
to disambiguate, no new using needed.
Tested: dotnet build OK, dotnet test 11/11 green.
Quill was never wired up on themeok (no .cshtml reference,
no @addTagHelper, no C# binding). It lived only as static
CSS/JS in wwwroot/ — dead weight in the repo.
The rich text editor for blog posts is PostIt (XPlat), not
the browser. Quill is no longer needed.
Removes:
- src/Yavsc.Org/wwwroot/css/main/quill.snow.css
- src/Yavsc.Org/wwwroot/css/main/quill.snow.min.css
- src/Yavsc.Org/wwwroot/js/quill.js
- src/Yavsc.Org/wwwroot/js/quill.min.js
- (also removed from disk, was untracked: quill.bundle.min.js)
Tested: dotnet test 11/11 green (no C# touched, but rule is rule).
This commit marks the current state of themeok as the
canonical visual reference for the upcoming theme
refactoring.
What this point of the branch represents:
- Bootstrap 5 (quartz theme) loaded via wwwroot/lib/bootstrap.quartz.min.css
- jQuery 3 + jQuery UI 1.14 + Bootstrap 5 JS bundle loaded from wwwroot/lib/
- New navbar partial src/Yavsc.Org/Views/Shared/_Nav.cshtml
(Bootstrap 5 navbar-dark bg-dark with dropdowns)
- _Layout.cshtml loading the new navbar via <partial name="_Nav" />
- The WIP 'Js and css cleanup' (31906a78) — CSS vendor files
dropped from wwwroot/css/ and moved to wwwroot/css/main/
where appropriate
- The gitignore cleanup (ebfc3d77) — vendor lib files no
longer tracked in the repo, restored via npm at build time
Out of scope for this snapshot:
- Home/Index.cshtml content (still empty container)
- Other view migrations to Bootstrap 5
- Quill removal
- Cookie SameSite=None fix in Program.cs
- jQuery-as-global-script refac (lives on refac/js-bundle
branch, will be merged later)
Tested: dotnet test 11/11 green.
Drops 1038 files from src/Yavsc.Org/wwwroot/lib/ — they remain
on disk and are now restored via 'npm install' at build time
(see package.json and esbuild.config.mjs).
Exception: jonthornton-Datepair is not on npm, the bundled
files are kept in wwwroot/lib/jonthornton-Datepair/ as static
assets.
Also extends .gitignore to ignore:
- node_modules/, build/, package-lock.json (esbuild toolchain)
- wwwroot/js/*.min.js (regenerated by 'npm run build:js')
- .Production.env (added explicitly, not matched by '.*.env'
glob in some git versions)
This aligns themeok with the architecture already in place
on refac/js-bundle (commits ed7522c5, 196f4b0b, 292c0a2f on
that branch). The build artifacts were already present in
node_modules/ and build/ on disk; this commit only stops
tracking them.
Tested: dotnet test 11/11 green (no C# code touched).
datetime.bundle.min.js and timepicker.bundle.min.js no longer
bundle jQuery and jQuery UI. The datepicker and timepicker
plugins attach to global jQuery when they are evaluated, which
is already loaded by _Layout.cshtml.
Bundle sizes:
- datetime: 545 KB → 201 KB
- timepicker: 354 KB → 12 KB
NOTE: This commit does not touch any versioned file. The
build/ directory and the .min.js outputs under
wwwroot/js/ are gitignored. The bundles are regenerated by
'npm run build:js' (see INSTALL.md and the script 'build:js'
in package.json).
Build state is partially migrated: core, chat, datetime, and
timepicker are clean. dropzone is still pending. Redundancy is
harmless (the second jQuery load is a no-op override) but
wasteful; full cleanup is the goal of this refac.
Tested: dotnet test 11/11 green.
chat.bundle.min.js no longer bundles jQuery, jQuery UI,
jquery-validation, jquery-validation-unobtrusive, showdown,
or to-markdown. The application code (chat.js, comment.js)
consumes them from window.$ / window.jQuery (provided by the
layout's global scripts) or does not need them at all.
Bundle size: 591 KB → 7.6 KB.
NOTE: This commit does not touch any versioned file. The
build/ directory and the .min.js outputs under
wwwroot/js/ are gitignored. The bundle is regenerated by
'npm run build:js' (see INSTALL.md and the script 'build:js'
in package.json).
Build state is partially migrated: only chat is clean so far.
Other bundles (core, dropzone, datetime, timepicker) still
bundle jQuery — upcoming commits will clean them up too.
Redundancy is harmless (the second jQuery load is a no-op
override) but wasteful; full cleanup is the goal of this
refac.
Tested: dotnet test 11/11 green.
JQuery, jQuery UI, Bootstrap, jquery-validation and
jquery-validation-unobtrusive are now loaded as separate
<script> tags by _Layout.cshtml, BEFORE the core bundle.
Why: esbuild IIFE bundles do not expose jQuery ($ and jQuery)
on window — UMD-style modules bundled in IIFE format are wrapped
in a closure. The application code (site.js, md-helpers.js,
yavsc-remote-fs.js, etc.) consumes window.$ / window.jQuery, so
it broke at runtime. Loading these scripts as global <script> tags
restores the expected global exposure.
This commit only touches the layout. Future commits will remove
the corresponding imports from each bundle's entry (chat, dropzone,
datetime, timepicker) and let them rely on window.$ being already
defined by the layout.
Tested: dotnet test 11/11 green. The new global scripts are
served by ASP.NET static files (HTTP 200 verified). Server
restart by developer required to pick up the new layout.
Removing the 'bootstrap' and 'popper.js' NuGet package references
that were used solely to copy assets to wwwroot/ at build time.
The npm-based esbuild bundles now provide the same files, and the
duplicate-asset build error is gone.
'bootstrap 5.3.8' (NuGet) was flagged with vulnerabilities by
Dependabot. Pinning to 4.6.2 via npm (matching what the views
were using from wwwroot/lib/) is closer to what the rest of the
codebase expects.
Verified: 'dotnet test' passes (11/11).
Refs: this is the fix to make the 'separate front assets into
esbuild bundles' commit green.
Add ignore rules for the new front-end toolchain:
- node_modules/ : npm install output
- build/ : esbuild entry files (regenerated by build:js)
- package-lock.json : not committed (use package.json as canonical)
- src/Yavsc.Org/wwwroot/lib/ : vendor libs (replaced by bundles)
with exception for jonthornton-Datepair/ (not on npm)
- src/Yavsc.Org/wwwroot/js/*.min.js : generated by esbuild
The esbuild bundles under wwwroot/js and wwwroot/css are now
produced by 'npm run build:js'. Document this in INSTALL.md so
new contributors know to run 'npm install' before 'make install'.