package com.vtence.molecule.http; import org.junit.Test; import static java.util.Locale.CANADA_FRENCH; import static java.util.Locale.ENGLISH; import static java.util.Locale.FRENCH; import static java.util.Locale.ITALY; import static java.util.Locale.UK; import static java.util.Locale.US; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; public class AcceptLanguageTest { @Test public void prefersNoLocaleWhenEmpty() { AcceptLanguage acceptLanguage = AcceptLanguage.parse(""); assertThat("no locale", acceptLanguage.list(), empty()); } @Test public void parsesNaturalLanguage() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("fr"); assertThat("all locales", acceptLanguage.list(), contains(FRENCH)); } @Test public void parsesNaturalLanguageAndCountry() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("fr-ca"); assertThat("all locales", acceptLanguage.list(), contains(CANADA_FRENCH)); } @Test public void listsAcceptableLocalesInPreferenceOrder() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en; q=0.8, fr-ca"); assertThat("all locales", acceptLanguage.list(), contains(CANADA_FRENCH, ENGLISH)); } @Test public void selectsNoLanguageWhenThereIsNoCandidate() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en"); assertThat("best locale", acceptLanguage.selectBest(), nullValue()); } @Test public void selectsAcceptableLanguageWithHighestQuality() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en; q=0.8, fr-ca"); assertThat("best locale", acceptLanguage.selectBest(ENGLISH, CANADA_FRENCH), equalTo(CANADA_FRENCH)); } @Test public void selectsFirstAmongstSupportedLocalesOfSameQuality() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en; q=0.8, fr-ca, it-it"); assertThat("best locale", acceptLanguage.selectBest(CANADA_FRENCH, ITALY), equalTo(CANADA_FRENCH)); } @Test public void selectsNoLocaleWhenCandidatesAreNotAcceptable() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en; q=0, fr-ca"); assertThat("best locale", acceptLanguage.selectBest(ENGLISH), nullValue()); } @Test public void fallsBackToAMoreGeneralLanguageWhenCountrySpecificLanguageNotAvailable() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en-GB"); assertThat("best locale", acceptLanguage.selectBest(US, ENGLISH), equalTo(ENGLISH)); } @Test public void usesCountrySpecificLanguageWhenGeneralLanguageNotSupported() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en"); assertThat("best locale", acceptLanguage.selectBest(FRENCH, UK), equalTo(UK)); } @Test public void usesCountrySpecificLanguageEvenWhenThereIsALowerQualityExactMatch() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("fr; q=0.8, en"); assertThat("best locale", acceptLanguage.selectBest(FRENCH, UK), equalTo(UK)); } @Test public void fallbacksToAnotherCountryOfSameLanguageIfRequestedCountryIsNotAvailable() { AcceptLanguage acceptLanguage = AcceptLanguage.parse("en-GB"); assertThat("best locale", acceptLanguage.selectBest(US), equalTo(US)); } }