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("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},
		},
	}
}
