|
@@ -1,23 +1,90 @@
|
|
package api
|
|
package api
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "bytes"
|
|
|
|
+ "encoding/json"
|
|
"fmt"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"net/http/httptest"
|
|
- "strings"
|
|
|
|
"testing"
|
|
"testing"
|
|
|
|
+
|
|
|
|
+ "code.osinet.fr/fgm/kurz/domain"
|
|
)
|
|
)
|
|
|
|
|
|
-func TestHandlePostTarget(t *testing.T) {
|
|
|
|
|
|
+func setupPost(seed bool) (*httptest.Server, *http.Client) {
|
|
|
|
+ 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))
|
|
ts := httptest.NewServer(http.HandlerFunc(HandlePostTarget))
|
|
|
|
+
|
|
|
|
+ c := ts.Client()
|
|
|
|
+ c.CheckRedirect = doNotFollowRedirects
|
|
|
|
+
|
|
|
|
+ return ts, c
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestHandlePostTargetHappy(t *testing.T) {
|
|
|
|
+ ts, c := setupPost(false)
|
|
|
|
+ defer ts.Close()
|
|
|
|
+
|
|
|
|
+ target, err := json.Marshal(map[string]string{"target": sampleTarget})
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Log(err)
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Submitting a new valid target should succeed with 201 and return new short
|
|
|
|
+ res, err := c.Post(ts.URL, postContentType, bytes.NewReader(target))
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Log(err)
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+ if res.StatusCode != http.StatusCreated {
|
|
|
|
+ t.Log("Creation of new short for valid target should succeed")
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Submitting an existing target should fail with 409 and return existing short
|
|
|
|
+ res, err = c.Post(ts.URL, postContentType, bytes.NewReader(target))
|
|
|
|
+ if err != nil {
|
|
|
|
+ t.Log(err)
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+ if res.StatusCode != http.StatusConflict {
|
|
|
|
+ t.Error("Re-creation of existing short should conflict")
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestHandlePostTargetSad(t *testing.T) {
|
|
|
|
+ ts, c := setupPost(true)
|
|
defer ts.Close()
|
|
defer ts.Close()
|
|
|
|
|
|
- res, err := http.Post(ts.URL, "application/json", strings.NewReader(""))
|
|
|
|
|
|
+ target, err := json.Marshal(map[string]string{"target": sampleTarget + "bis"})
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Submitting an invalid target should fail with 400
|
|
|
|
+ res, err := c.Post(ts.URL, postContentType, nil)
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ t.FailNow()
|
|
|
|
+ }
|
|
|
|
+ if res.StatusCode != http.StatusBadRequest {
|
|
|
|
+ t.Error("Creation of short for empty target should be a bad request")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Submitting a new valid target should fail with 50x since mock repo is set to no creation.
|
|
|
|
+ res, err = c.Post(ts.URL, postContentType, bytes.NewReader(target))
|
|
if err != nil {
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
fmt.Println(err)
|
|
t.FailNow()
|
|
t.FailNow()
|
|
}
|
|
}
|
|
- if res.StatusCode != http.StatusNotImplemented {
|
|
|
|
- t.Error("Post should return a 'not implemented' error")
|
|
|
|
|
|
+ if res.StatusCode != http.StatusInternalServerError {
|
|
|
|
+ t.Error("Creation of new short for valid target should fail since repository cannot create")
|
|
}
|
|
}
|
|
}
|
|
}
|