diff --git a/src/LocalesResolvers/Cookie.php b/src/LocalesResolvers/Cookie.php new file mode 100644 index 0000000..1953de0 --- /dev/null +++ b/src/LocalesResolvers/Cookie.php @@ -0,0 +1,58 @@ +httpRequest = $httpRequest; + $this->httpResponse = $httpResponse; + } + + public function setLocale( + ?string $locale, + ?string $expire = null, + ): self + { + if (is_string($locale)) { + $this->httpResponse->setCookie(self::$parameter, $locale, $expire ?? self::$expire); + + } else { + $this->httpResponse->deleteCookie(self::$parameter); + + } + + return $this; + } + + public function resolve( + Translator $translator, + ): ?string + { + $locale = $this->httpRequest->getCookie(self::$parameter); + + if (is_string($locale)) { + return $locale; + } + + return null; + } + +} diff --git a/tests/Tests/LocalesResolvers/CookieTest.phpt b/tests/Tests/LocalesResolvers/CookieTest.phpt new file mode 100644 index 0000000..9bb7a6e --- /dev/null +++ b/tests/Tests/LocalesResolvers/CookieTest.phpt @@ -0,0 +1,68 @@ +resolve(null)); + Assert::same('cs', $this->resolve('cs')); + Assert::same('en', $this->resolve('en')); + Assert::null($this->resolve(null)); + } + + private function resolve( + ?string $locale + ): ?string + { + $response = Mockery::mock(IResponse::class); + $response->shouldReceive('setCookie')->andReturnUsing(function ($name, $value) { + self::$cookies[$name] = $value; + self::$cookies = array_filter(self::$cookies); + }); + $response->shouldReceive('deleteCookie')->andReturnUsing(function ($name) { + unset(self::$cookies[$name]); + }); + + $request = Mockery::mock(IRequest::class); + $request->shouldReceive('getCookie')->andReturnUsing(function ($name) { + return self::$cookies[$name] ?? null; + }); + + $resolver = new Cookie( + $request, + $response, + ); + + $translator = new Translator( + new LocaleResolver($this->container), + new FallbackResolver(), + 'en' + ); + + $resolver->setLocale($locale); + + return $resolver->resolve($translator); + } + +} + +(new CookieTest($container))->run();