| // Copyright 2017 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package goscaffold |
| |
| import ( |
| "net/http" |
| |
| . "github.com/onsi/ginkgo" |
| . "github.com/onsi/gomega" |
| ) |
| |
| var _ = Describe("Accept header tests", func() { |
| It("No nothing", func() { |
| Expect(SelectMediaType( |
| makeRequest(""), []string{})).Should(BeEmpty()) |
| }) |
| |
| It("No header, one choice", func() { |
| Expect(SelectMediaType( |
| makeRequest(""), |
| []string{"text/plain"})).Should(Equal("text/plain")) |
| }) |
| |
| It("No header, two choices", func() { |
| Expect(SelectMediaType( |
| makeRequest(""), |
| []string{"text/plain", "text/xml"})).Should(Equal("text/plain")) |
| }) |
| |
| It("No header, two choices 2", func() { |
| Expect(SelectMediaType( |
| makeRequest(""), |
| []string{"application/json", "text/plain"})).Should(Equal("application/json")) |
| }) |
| |
| It("Accept all, two choices", func() { |
| Expect(SelectMediaType( |
| makeRequest("*/*"), |
| []string{"text/plain", "text/xml"})).Should(Equal("text/plain")) |
| }) |
| |
| It("Accept all, two choices 2", func() { |
| Expect(SelectMediaType( |
| makeRequest("*/*"), |
| []string{"application/json", "text/plain"})).Should(Equal("application/json")) |
| }) |
| |
| It("One Header, two choices", func() { |
| Expect(SelectMediaType( |
| makeRequest("application/json"), |
| []string{"text/plain", "application/json"})).Should(Equal("application/json")) |
| }) |
| |
| It("One Header, bad choices", func() { |
| Expect(SelectMediaType( |
| makeRequest("application/json"), |
| []string{"text/plain", "application/xml"})).Should(Equal("")) |
| }) |
| |
| It("audio/basic", func() { |
| req := makeRequest("audio/*; q=0.2, audio/basic") |
| Expect(SelectMediaType(req, |
| []string{"audio/mp3", "audio/basic"})).Should(Equal("audio/basic")) |
| Expect(SelectMediaType(req, |
| []string{"audio/mp3", "text/plain"})).Should(Equal("audio/mp3")) |
| Expect(SelectMediaType(req, |
| []string{"text/plain", "application/xml"})).Should(Equal("")) |
| }) |
| |
| It("text/plain", func() { |
| req := makeRequest("text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c") |
| Expect(SelectMediaType(req, |
| []string{"text/html", "text/x-c"})).Should(Equal("text/html")) |
| Expect(SelectMediaType(req, |
| []string{"text/x-c", "text/html"})).Should(Equal("text/html")) |
| Expect(SelectMediaType(req, |
| []string{"text/x-dvi", "text/plain"})).Should(Equal("text/x-dvi")) |
| Expect(SelectMediaType(req, |
| []string{"text/plain"})).Should(Equal("text/plain")) |
| Expect(SelectMediaType(req, |
| []string{"application/json"})).Should(Equal("")) |
| }) |
| |
| It("text/plain 2", func() { |
| req := makeRequest( |
| `text/*;q=0.3, text/html;q=0.7, text/html;level=1, |
| text/html;level=2;q=0.4, */*;q=0.5`) |
| Expect(SelectMediaType(req, |
| []string{"text/plain", "text/html;level=1", "text/html", "image/jpeg", "text/html;level=2", "foo/bar"})). |
| Should(Equal("text/html;level=1")) |
| Expect(SelectMediaType(req, |
| []string{"image/jpeg", "text/html", "text/plain", "text/html;level=2", "foo/bar"})). |
| Should(Equal("text/html")) |
| Expect(SelectMediaType(req, |
| []string{"image/jpeg", "text/plain", "text/html;level=2"})). |
| Should(Equal("image/jpeg")) |
| Expect(SelectMediaType(req, |
| []string{"text/plain", "text/html;level=2"})). |
| Should(Equal("text/html;level=2")) |
| }) |
| |
| It("Weird Browser example", func() { |
| req := makeRequest("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json") |
| Expect(SelectMediaType(req, |
| []string{"application/xml", "text/xml", "text/html", "application/json"})). |
| Should(Equal("text/html")) |
| Expect(SelectMediaType(req, |
| []string{"application/xml", "application/json"})). |
| Should(Equal("application/json")) |
| }) |
| |
| It("Firefox Example", func() { |
| req := makeRequest("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") |
| Expect(SelectMediaType(req, |
| []string{"application/xml", "text/xml", "text/html", "text/plain", "application/json"})). |
| Should(Equal("text/html")) |
| Expect(SelectMediaType(req, |
| []string{"application/xml", "application/json"})). |
| Should(Equal("application/xml")) |
| Expect(SelectMediaType(req, |
| []string{"application/json"})). |
| Should(Equal("application/json")) |
| }) |
| |
| It("Parse accept part", func() { |
| ap := parseAcceptPart("text/plain", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain")) |
| Expect(ap.precedence).Should(BeEquivalentTo(1.0)) |
| ap = parseAcceptPart("text/plain;q=0.2", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain")) |
| Expect(ap.precedence).Should(BeNumerically("~", 0.2)) |
| ap = parseAcceptPart("text/plain; q=0.2", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain")) |
| Expect(ap.precedence).Should(BeNumerically("~", 0.2)) |
| ap = parseAcceptPart("text/plain;level=1", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain;level=1")) |
| Expect(ap.precedence).Should(BeEquivalentTo(1.0)) |
| ap = parseAcceptPart("text/plain;level=1;q=0.5", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain;level=1")) |
| Expect(ap.precedence).Should(BeNumerically("~", 0.5)) |
| ap = parseAcceptPart("text/plain;level=1;q=0.5;foo=bar", 0) |
| Expect(ap.major).Should(Equal("text")) |
| Expect(ap.minor).Should(Equal("plain;level=1;foo=bar")) |
| Expect(ap.precedence).Should(BeNumerically("~", 0.5)) |
| }) |
| }) |
| |
| func makeRequest(accept string) *http.Request { |
| return &http.Request{ |
| Header: http.Header{ |
| "Accept": []string{accept}, |
| }, |
| } |
| } |