Implement creator studio and upload updates

This commit is contained in:
2026-04-04 10:12:02 +02:00
parent 1da7d3bf88
commit 0b216b7ecd
15107 changed files with 31206 additions and 626514 deletions

View File

@@ -242,6 +242,29 @@ it('public collection routes redirect to the canonical target after canonicaliza
->assertRedirect(route('profile.collections.show', ['username' => strtolower((string) $owner->username), 'slug' => $target->slug]));
});
it('public collection detail exposes normalized seo props', function () {
$owner = User::factory()->create(['username' => 'seocollectionowner']);
$collection = Collection::factory()->for($owner)->create([
'title' => 'SEO Collection Detail',
'slug' => 'seo-collection-detail',
'description' => 'A public collection used to verify normalized SEO props.',
'visibility' => Collection::VISIBILITY_PUBLIC,
'lifecycle_state' => Collection::LIFECYCLE_PUBLISHED,
'moderation_status' => Collection::MODERATION_ACTIVE,
'workflow_state' => Collection::WORKFLOW_APPROVED,
]);
$this->get(route('profile.collections.show', ['username' => strtolower((string) $owner->username), 'slug' => $collection->slug]))
->assertOk()
->assertInertia(fn ($page) => $page
->component('Collection/CollectionShow')
->where('seo.title', fn ($value) => is_string($value) && str_contains($value, 'SEO Collection Detail'))
->where('seo.description', fn ($value) => is_string($value) && str_contains($value, 'verify normalized SEO props'))
->where('seo.robots', 'index,follow')
->where('seo.canonical', route('profile.collections.show', ['username' => strtolower((string) $owner->username), 'slug' => $collection->slug])));
});
it('owners can dismiss duplicate candidates from merge review', function () {
$owner = User::factory()->create(['username' => 'mergedismissowner']);
@@ -617,6 +640,31 @@ it('public search only returns safe public collections', function () {
->where('collections.0.title', 'Visible Search Result'));
});
it('public collection search exposes noindex seo props on filtered pages', function () {
$owner = User::factory()->create(['username' => 'seosearchowner']);
Collection::factory()->for($owner)->create([
'title' => 'SEO Search Target',
'slug' => 'seo-search-target',
'visibility' => Collection::VISIBILITY_PUBLIC,
'lifecycle_state' => Collection::LIFECYCLE_PUBLISHED,
'moderation_status' => Collection::MODERATION_ACTIVE,
'workflow_state' => Collection::WORKFLOW_APPROVED,
'placement_eligibility' => true,
]);
$url = route('collections.search', ['q' => 'SEO Search Target']);
$this->get($url)
->assertOk()
->assertInertia(fn ($page) => $page
->component('Collection/CollectionFeaturedIndex')
->where('seo.robots', 'noindex,follow')
->where('seo.canonical', $url)
->where('seo.title', 'Search Collections — Skinbase Nova')
->where('seo.description', 'Search results for "SEO Search Target" across public Skinbase Nova collections.'));
});
it('saved collections support private saved notes', function () {
$user = User::factory()->create(['username' => 'savednoteowner']);
$curator = User::factory()->create(['username' => 'savednotecurator']);