package com.vtence.molecule.http; import com.vtence.molecule.Request; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; public class AcceptEncodingTest { @Test public void selectsNoEncodingWhenThereAreNoCandidates() { assertThat("selected", select("gzip", fromCandidates()), nullValue()); } @Test public void selectsAcceptableEncodingWithHighestQuality() { assertThat("highest quality", select("compress; q=0.5, gzip", fromCandidates("compress", "gzip")), equalTo("gzip")); assertThat("first", select("gzip, deflate", fromCandidates("deflate", "gzip")), equalTo("gzip")); } @Test public void selectsNoEncodingWhenCandidatesAreNotAcceptable() { assertThat("selected", select("compress, deflate; q=0", fromCandidates("gzip", "deflate")), nullValue()); } @Test public void considersIdentityEncodingAcceptableByDefault() { assertThat("no preference", select("", fromCandidates("gzip", "identity")), equalTo("identity")); assertThat("none specified supported", select("deflate, gzip", fromCandidates("identity")), equalTo("identity")); assertThat("candidates rejected", select("deflate; q=0, gzip; q=0", fromCandidates("gzip", "deflate", "identity")), equalTo("identity")); assertThat("all but identity rejected", select("*; q=0, identity; q=0.1", fromCandidates("gzip", "deflate", "identity")), equalTo("identity")); } @Test public void considersIdentityEncodingNoLongerAcceptableWhenExplicitlyOrImplicitlyRefused() { assertThat("explicitly refused", select("identity; q=0", fromCandidates("identity")), nullValue()); assertThat("implicitly refused", select("*; q=0", fromCandidates("identity")), nullValue()); } @Test public void selectsFirstOfHighestQualityEncodingsWhenAnyIsAcceptable() { assertThat("all accepted", select("*", fromCandidates("gzip", "deflate", "identity")), equalTo("gzip")); assertThat("all but gzip preferred", select("gzip; q=0.9, *", fromCandidates("gzip", "deflate", "compress")), equalTo("deflate")); } @Test public void handlesAbsenceOfAcceptEncodingHeader() { AcceptEncoding accept = AcceptEncoding.of(new Request()); assertThat("encoding of missing header", accept.selectBestEncoding("gzip", "identity"), equalTo("identity")); } private String select(String header, List<String> candidates) { AcceptEncoding acceptEncoding = AcceptEncoding.parse(header); return acceptEncoding.selectBestEncoding(candidates); } public static List<String> fromCandidates(String... candidates) { return new ArrayList<>(Arrays.asList(candidates)); } }