Skip to content
This repository has been archived by the owner on May 11, 2022. It is now read-only.

Commit

Permalink
issue #52: prepare integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilsk committed Jan 26, 2018
1 parent bde1564 commit 166c078
Show file tree
Hide file tree
Showing 19 changed files with 277 additions and 113 deletions.
3 changes: 1 addition & 2 deletions cmd/run.go
Expand Up @@ -23,8 +23,7 @@ var runCmd = &cobra.Command{
server.New(
cmd.Flag("baseURL").Value.String(),
cmd.Flag("tplDir").Value.String(),
service.New(
dao.Must(dao.Connection(dsn(cmd))))),
service.New(dao.Must(dao.Connection(dsn(cmd))))),
isTrue(cmd.Flag("with-profiler").Value))
srv := &http.Server{Addr: addr, Handler: handler,
ReadTimeout: 0,
Expand Down
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.html.golden
@@ -1 +1 @@
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded"><label for="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email">Email</label><input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email" name="email" type="email" title="Email" maxlength="64" required><input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4__redirect" name="_redirect" type="hidden" value="https://kamil.samigullin.info/"><input type="submit"></form>
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded"><label for="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email">Email</label><input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email" name="email" type="email" title="Email" maxlength="64" required><input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4__redirect" name="_redirect" type="hidden" value="https://kamil.samigullin.info/"><input type="submit"></form>
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.json
@@ -1,7 +1,7 @@
{
"id": "41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"title": "Email subscription",
"action": "http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"action": "http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"method": "post",
"enctype": "application/x-www-form-urlencoded",
"input": [
Expand Down
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.json.golden
@@ -1,7 +1,7 @@
{
"id": "41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"title": "Email subscription",
"action": "http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"action": "http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4",
"method": "post",
"enctype": "application/x-www-form-urlencoded",
"input": [
Expand Down
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.xml
@@ -1,4 +1,4 @@
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded">
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded">
<input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email" name="email" type="email" title="Email" maxlength="64" required="true"/>
<input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4__redirect" name="_redirect" type="hidden" value="https://kamil.samigullin.info/"/>
</form>
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.xml.golden
@@ -1,4 +1,4 @@
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded">
<form id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4" title="Email subscription" action="http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4" method="post" enctype="application/x-www-form-urlencoded">
<input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4_email" name="email" type="email" title="Email" maxlength="64" required="true"></input>
<input id="41ca5e09-3ce2-4094-b108-3ecc257c6fa4__redirect" name="_redirect" type="hidden" value="https://kamil.samigullin.info/"></input>
</form>
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.yaml
@@ -1,6 +1,6 @@
id: 41ca5e09-3ce2-4094-b108-3ecc257c6fa4
title: Email subscription
action: http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
action: http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
method: post
enctype: application/x-www-form-urlencoded
input:
Expand Down
2 changes: 1 addition & 1 deletion domen/fixtures/email_subscription.yaml.golden
@@ -1,6 +1,6 @@
id: 41ca5e09-3ce2-4094-b108-3ecc257c6fa4
title: Email subscription
action: http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
action: http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4
method: post
enctype: application/x-www-form-urlencoded
input:
Expand Down
2 changes: 1 addition & 1 deletion domen/fixtures/stored_in_db.xml.golden
@@ -1,4 +1,4 @@
<form title="Email subscription" action="http://localhost:8080/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4">
<form title="Email subscription" action="http://form-api.dev/api/v1/41ca5e09-3ce2-4094-b108-3ecc257c6fa4">
<input name="email" type="email" title="Email" maxlength="64" required="true"></input>
<input name="_redirect" type="hidden" value="https://kamil.samigullin.info/"></input>
</form>
39 changes: 27 additions & 12 deletions domen/serialization_test.go
Expand Up @@ -5,15 +5,21 @@ import (
"encoding/xml"
"flag"
"io/ioutil"
"net/url"
"os"
"path"
"testing"

"github.com/kamilsk/form-api/domen"
"github.com/stretchr/testify/assert"
"gopkg.in/yaml.v2"
)

const UUID domen.UUID = "41ca5e09-3ce2-4094-b108-3ecc257c6fa4"
const (
HOST = "http://form-api.dev/"
APIv1 = "api/v1"
UUID = domen.UUID("41ca5e09-3ce2-4094-b108-3ecc257c6fa4")
)

var update = flag.Bool("update", false, "update .golden files")

Expand All @@ -26,7 +32,7 @@ func TestHTML(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.html.golden", domen.Schema{
ID: UUID.String(),
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -79,7 +85,7 @@ func TestJSON(t *testing.T) {
{"email subscription", domen.Schema{
ID: UUID.String(),
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -128,7 +134,7 @@ func TestJSON_Decode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.json", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -170,7 +176,7 @@ func TestJSON_Encode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.json.golden", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -223,7 +229,7 @@ func TestXML(t *testing.T) {
{"email subscription", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -272,7 +278,7 @@ func TestXML_Decode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.xml", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -314,7 +320,7 @@ func TestXML_Encode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.xml.golden", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand All @@ -336,7 +342,7 @@ func TestXML_Encode(t *testing.T) {
}},
{"stored in db", "./fixtures/stored_in_db.xml.golden", domen.Schema{
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Inputs: []domen.Input{
{
Name: "email",
Expand Down Expand Up @@ -385,7 +391,7 @@ func TestYAML(t *testing.T) {
{"email subscription", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -434,7 +440,7 @@ func TestYAML_Decode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.yaml", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -484,7 +490,7 @@ func TestYAML_Encode(t *testing.T) {
{"email subscription", "./fixtures/email_subscription.yaml.golden", domen.Schema{
ID: UUID.String() + "",
Title: "Email subscription",
Action: "http://localhost:8080/api/v1/" + UUID.String(),
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
Expand Down Expand Up @@ -537,6 +543,15 @@ func closeAfter(file *os.File, action func() error) error {
return nil
}

func join(base string, paths ...string) string {
u, err := url.Parse(base)
if err != nil {
panic(err)
}
u.Path = path.Join(append([]string{u.Path}, paths...)...)
return u.String()
}

func reader(file string) *os.File {
f, err := os.OpenFile(file, os.O_RDONLY, 0)
if err != nil {
Expand Down
180 changes: 180 additions & 0 deletions integration_test.go
@@ -0,0 +1,180 @@
//go:generate echo $PWD/$GOPACKAGE/$GOFILE
//go:generate mockgen -package main -destination $PWD/mock_storage_test.go github.com/kamilsk/form-api/service Storage
package main

import (
"io/ioutil"
"net/http"
"net/http/httptest"
"net/url"
"path"
"testing"

"github.com/golang/mock/gomock"
"github.com/kamilsk/form-api/domen"
"github.com/kamilsk/form-api/errors"
"github.com/kamilsk/form-api/server"
"github.com/kamilsk/form-api/server/router/chi"
"github.com/kamilsk/form-api/service"
"github.com/kamilsk/form-api/transfer/encoding"
"github.com/stretchr/testify/assert"
)

const (
HOST = "http://form-api.dev/"
APIv1 = "api/v1"
UUID = domen.UUID("41ca5e09-3ce2-4094-b108-3ecc257c6fa4")
ZERO = domen.UUID("00000000-0000-0000-0000-000000000000")
)

func TestAPI_GetV1(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()

var (
storage = NewMockStorage(ctrl)
)

handler := chi.NewRouter(server.New(HOST, "", service.New(storage)), false)
srv := httptest.NewServer(handler)
defer srv.Close()

{
var (
expected = domen.Schema{
ID: UUID.String(),
Title: "Email subscription",
Action: join(HOST, APIv1, UUID.String()),
Method: "post",
EncodingType: "application/x-www-form-urlencoded",
Inputs: []domen.Input{
{
ID: UUID.String() + "_email",
Name: "email",
Type: "email",
Title: "Email",
MaxLength: 64,
Required: true,
},
{
ID: UUID.String() + "__redirect",
Name: "_redirect",
Type: "hidden",
Value: "https://kamil.samigullin.info/",
},
},
}
)

tests := []struct {
name string
request *http.Request
golden string
}{
{"get schema as HTML", func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
req.Header.Set("Accept", encoding.HTML)
return req
}(), "./transfer/encoding/fixtures/email_subscription.html.golden"},
{"get schema as JSON", func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
req.Header.Set("Accept", encoding.JSON)
return req
}(), "./transfer/encoding/fixtures/email_subscription.json.golden"},
{"get schema as XML", func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
req.Header.Set("Accept", encoding.XML)
return req
}(), "./transfer/encoding/fixtures/email_subscription.xml.golden"},
{"get schema as text", func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
req.Header.Set("Accept", encoding.TEXT)
return req
}(), "./transfer/encoding/fixtures/email_subscription.yaml.golden"},
}
storage.EXPECT().Schema(UUID).Times(len(tests)).Return(expected, nil)

for _, test := range tests {
tc := test
t.Run(test.name, func(t *testing.T) {
resp, err := http.DefaultClient.Do(tc.request)
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)

expected, err := ioutil.ReadFile(tc.golden)
assert.NoError(t, err)
obtained, err := ioutil.ReadAll(resp.Body)
assert.NoError(t, err)
assert.NoError(t, resp.Body.Close())
assert.Equal(t, expected, obtained)
})
}
}

{
tests := []struct {
name string
request *http.Request
code int
}{
{http.StatusText(http.StatusBadRequest), func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, ZERO.String()), nil)
if err != nil {
panic(err)
}
return req
}(), http.StatusBadRequest},
{http.StatusText(http.StatusNotAcceptable), func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
req.Header.Set("Accept", "application/toml")
return req
}(), http.StatusNotAcceptable},
{http.StatusText(http.StatusNotFound), func() *http.Request {
req, err := http.NewRequest(http.MethodGet, join(srv.URL, APIv1, UUID.String()), nil)
if err != nil {
panic(err)
}
return req
}(), http.StatusNotFound},
}
storage.EXPECT().Schema(UUID).Times(1).Return(domen.Schema{}, errors.NotFound("", nil, ""))

for _, test := range tests {
tc := test
t.Run(test.name, func(t *testing.T) {
resp, err := http.DefaultClient.Do(tc.request)
assert.NoError(t, err)
assert.Equal(t, tc.code, resp.StatusCode)
})
}
}
}

func TestAPI_PostV1(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
}

func join(base string, paths ...string) string {
u, err := url.Parse(base)
if err != nil {
panic(err)
}
u.Path = path.Join(append([]string{u.Path}, paths...)...)
return u.String()
}

0 comments on commit 166c078

Please sign in to comment.