@@ -318,6 +318,70 @@ public function testAttribute()
318318 $ this ->assertSame (CacheAttributeController::CLASS_SMAXAGE , $ response ->getMaxAge ());
319319 }
320320
321+ /**
322+ * @dataProvider provideVaryHeaderScenarios
323+ */
324+ public function testHasRelevantVaryHeaderBehavior (array $ responseVary , array $ cacheVary , bool $ varyByLanguage , array $ expectedVary )
325+ {
326+ $ request = $ this ->createRequest (new Cache (vary: $ cacheVary ));
327+ $ request ->attributes ->set ('_vary_by_language ' , $ varyByLanguage );
328+
329+ $ response = new Response ();
330+ $ response ->setVary ($ responseVary );
331+
332+ $ listener = new CacheAttributeListener ();
333+ $ event = new ResponseEvent ($ this ->getKernel (), $ request , HttpKernelInterface::MAIN_REQUEST , $ response );
334+ $ listener ->onKernelResponse ($ event );
335+
336+ $ this ->assertSame ($ expectedVary , $ response ->getVary ());
337+ }
338+
339+ public static function provideVaryHeaderScenarios (): \Traversable
340+ {
341+ yield 'no vary headers at all ' => [
342+ 'responseVary ' => [],
343+ 'cacheVary ' => ['X-Foo ' ],
344+ 'varyByLanguage ' => false ,
345+ 'expectedVary ' => ['X-Foo ' ],
346+ ];
347+ yield 'response vary accept-language only, vary_by_language true (append new) ' => [
348+ 'responseVary ' => ['Accept-Language ' ],
349+ 'cacheVary ' => ['X-Bar ' ],
350+ 'varyByLanguage ' => true ,
351+ 'expectedVary ' => ['Accept-Language ' , 'X-Bar ' ], // X-Bar is added
352+ ];
353+ yield 'response vary accept-language only, vary_by_language false (no append) ' => [
354+ 'responseVary ' => ['Accept-Language ' ],
355+ 'cacheVary ' => ['X-Bar ' ],
356+ 'varyByLanguage ' => false ,
357+ 'expectedVary ' => ['Accept-Language ' ], // no append
358+ ];
359+ yield 'response vary multiple including accept-language, vary_by_language true (no append) ' => [
360+ 'responseVary ' => ['Accept-Language ' , 'User-Agent ' ],
361+ 'cacheVary ' => ['X-Baz ' ],
362+ 'varyByLanguage ' => true ,
363+ 'expectedVary ' => ['Accept-Language ' , 'User-Agent ' ], // no append
364+ ];
365+ yield 'cache vary is empty ' => [
366+ 'responseVary ' => ['X-Existing ' ],
367+ 'cacheVary ' => [],
368+ 'varyByLanguage ' => true ,
369+ 'expectedVary ' => ['X-Existing ' ], // nothing to add
370+ ];
371+ yield 'vary * (no append) — vary_by_language=true ' => [
372+ 'responseVary ' => ['* ' ],
373+ 'cacheVary ' => ['X-Foo ' ],
374+ 'varyByLanguage ' => true ,
375+ 'expectedVary ' => ['* ' ],
376+ ];
377+ yield 'vary * (no append) — vary_by_language=false ' => [
378+ 'responseVary ' => ['* ' ],
379+ 'cacheVary ' => ['X-Foo ' ],
380+ 'varyByLanguage ' => false ,
381+ 'expectedVary ' => ['* ' ],
382+ ];
383+ }
384+
321385 private function createRequest (Cache $ cache ): Request
322386 {
323387 return new Request ([], [], ['_cache ' => [$ cache ]]);
0 commit comments