| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | 
							- package api
 
- import (
 
- 	"bytes"
 
- 	"encoding/json"
 
- 	"io/ioutil"
 
- 	"net/http"
 
- 	"net/http/httptest"
 
- 	"testing"
 
- 	"code.osinet.fr/fgm/kurz/domain"
 
- )
 
- func jsonBody(t *testing.T, res *http.Response) Short {
 
- 	body, err := ioutil.ReadAll(res.Body)
 
- 	var actual Short
 
- 	err = json.Unmarshal(body, &actual)
 
- 	if err != nil {
 
- 		t.Logf("Response body is not valid JSON: %s", body)
 
- 		t.FailNow()
 
- 	}
 
- 	return actual
 
- }
 
- // subTest performs the main test work: settings up repositories, querying the
 
- // web API, and ensuring response status and format.
 
- func subTest(t *testing.T, seed bool, targetURL string, expectedStatus int, errorMessage string) *http.Response {
 
- 	tr := domain.MakeMockTargetRepo(!seed)
 
- 	if seed {
 
- 		tr.Data[domain.TargetURL{URL: domain.URL(sampleTarget)}] = domain.ShortURL{URL: domain.URL(sampleShort)}
 
- 	}
 
- 	domain.RegisterRepositories(domain.MockShortRepo{}, tr)
 
- 	ts := httptest.NewServer(http.HandlerFunc(handlePostTarget))
 
- 	defer ts.Close()
 
- 	c := ts.Client()
 
- 	c.CheckRedirect = doNotFollowRedirects
 
- 	target, err := json.Marshal(Target{Target: targetURL})
 
- 	if err != nil {
 
- 		panic(err)
 
- 	}
 
- 	res, err := c.Post(ts.URL, postContentType, bytes.NewReader(target))
 
- 	if err != nil {
 
- 		t.Log(err)
 
- 		t.FailNow()
 
- 	}
 
- 	if res.StatusCode != expectedStatus {
 
- 		t.Log(errorMessage)
 
- 		t.FailNow()
 
- 	}
 
- 	return res
 
- }
 
- // TestHandleGetShortHappyNew ensures that submitting a new valid target succeeds
 
- // with 201 and returns a new short.
 
- func TestHandleGetShortHappyNew(t *testing.T) {
 
- 	res := subTest(t, false, sampleTarget,
 
- 		http.StatusCreated, "Creation of new short for valid target should succeed")
 
- 	// Mock API creates short URLs equal to the target.
 
- 	actual := jsonBody(t, res)
 
- 	if actual.Short != sampleTarget {
 
- 		t.Logf("Response short URL is %s, expected %s", actual.Short, sampleTarget)
 
- 		t.FailNow()
 
- 	}
 
- }
 
- // TestHandleGetShortHappyOld ensures that submitting an existing target fails
 
- // with 409 and returns an existing short.
 
- func TestHandleGetShortHappyOld(t *testing.T) {
 
- 	res := subTest(t, true, sampleTarget,
 
- 		http.StatusConflict, "Re-creation of existing short should conflict")
 
- 	// It was created that way in the previous Post() call.
 
- 	actual := jsonBody(t, res)
 
- 	if actual.Short != sampleShort {
 
- 		t.Logf("Response short URL is %s, expected %s", actual.Short, sampleShort)
 
- 		t.FailNow()
 
- 	}
 
- }
 
- // TestHandlePostTargetSadEmpty ensures that submitting an invalid target fails with 400.
 
- func TestHandlePostTargetSadEmpty(t *testing.T) {
 
- 	subTest(t, true, "",
 
- 		http.StatusBadRequest, "Creation of short for empty target should be a bad request")
 
- }
 
- // TestHandlePostTargetSadUncreated ensures that submitting a new valid target
 
- // fails with 50x when the repository cannot create new short URLs.
 
- func TestHandlePostTargetSadUncreated(t *testing.T) {
 
- 	subTest(t, true, sampleTarget+"bis",
 
- 		http.StatusInternalServerError, "Creation of new short for valid target should fail since repository cannot create")
 
- }
 
 
  |