Incentive (E1): Bilder je Incentive, Teaser mit Call to Action oben, Praemie je Teampartner statt Punkte

Titelbild und Galerie liegen jetzt in public/img/incentive/<slug>/, der
Hauptordner ist nur noch Fallback fuers Titelbild. Damit erscheinen die
Montenegro-Impressionen nicht mehr unter der Challenge; die Fotos sind in
montenegro-incentive-2026/ verschoben.

Teaser: Call to Action "Bist du bereit fuer die Challenge?" mit Button ganz
oben. Bei Geldpraemie zeigen die Kacheln "Deine Praemie" (50 EUR je neuem
Teampartner) und "Top 3 Bonus" statt Incentive-Punkte, darunter der Abschnitt
"So funktioniert die Challenge". Rangliste: Button "Jetzt teilnehmen" wieder
in der Sekundaerfarbe.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-22 12:37:58 +00:00
parent 3341c929eb
commit f340d0de3d
20 changed files with 278 additions and 135 deletions

View file

@ -185,3 +185,49 @@ describe('Ranglisten-Seite: Teilnahme-Block oben', function () {
->assertSee(__('incentive.my_details'));
});
});
describe('Teaser-Seite der Challenge', function () {
it('zeigt den Call to Action ganz oben, die Praemie je Teampartner und keine Galerie', function () {
$incentive = vipOnlyChallenge(['vip_only' => false, 'image' => 'challenge.jpg', 'bonus_rank_2' => 300, 'bonus_rank_3' => 200]);
$this->actingAs(vipTestUser());
$response = $this->get(route('user_incentive_teaser', [$incentive->slug]))->assertOk();
$html = $response->getContent();
$cta = strpos($html, 'id="incentive-teaser-cta"');
$hero = strpos($html, 'class="incentive-hero mb-5"');
expect($cta)->not->toBeFalse()
->and($hero)->toBeGreaterThan($cta);
$response->assertSee(__('incentive.teaser_cta_ready'))
->assertSee(__('incentive.payout_per_partner_label'))
->assertSee('id="incentive-bonus-tile"', false)
->assertSee('id="incentive-how-it-works"', false)
->assertSee(__('incentive.section_how_it_works'))
->assertDontSee(__('incentive.section_points'))
->assertDontSee('class="gallery-section', false)
->assertDontSee(__('incentive.gallery_title'));
});
it('nimmt Galerie-Bilder nur aus dem eigenen Ordner des Incentives', function () {
$incentive = vipOnlyChallenge(['vip_only' => false, 'image' => 'hero.jpg']);
$other = vipOnlyChallenge(['vip_only' => false, 'image' => 'alt.jpg']);
$dir = public_path($incentive->imageDirectory());
@mkdir($dir, 0777, true);
file_put_contents($dir.'/hero.jpg', 'x');
file_put_contents($dir.'/b.jpg', 'x');
file_put_contents($dir.'/a.jpg', 'x');
try {
expect($incentive->galleryImages())->toBe([$incentive->imageDirectory().'/a.jpg', $incentive->imageDirectory().'/b.jpg'])
->and($incentive->heroImagePath())->toBe($incentive->imageDirectory().'/hero.jpg')
->and($other->galleryImages())->toBe([])
->and($other->heroImagePath())->toBe('img/incentive/'.$other->image);
} finally {
array_map('unlink', glob($dir.'/*') ?: []);
@rmdir($dir);
}
});
});