package content_test
import (
"bytes"
"errors"
"fmt"
"io"
"log"
"mime/multipart"
"net/http"
"net/http/httptest"
"net/url"
"os"
"strings"
"testing"
"git.sr.ht/~evanj/cms/internal/c"
"git.sr.ht/~evanj/cms/internal/c/content"
contentmodel "git.sr.ht/~evanj/cms/internal/m/content"
spaceT "git.sr.ht/~evanj/cms/internal/m/space"
userT "git.sr.ht/~evanj/cms/internal/m/user"
"git.sr.ht/~evanj/cms/internal/m/value"
"git.sr.ht/~evanj/cms/internal/m/valuetype"
"git.sr.ht/~evanj/cms/internal/s/db"
webhook "git.sr.ht/~evanj/cms/internal/s/hook"
"github.com/bmizerany/assert"
gomock "github.com/golang/mock/gomock"
"github.com/google/uuid"
)
var file, _ = os.Open("testfiles/zoidberg.png")
func bodyWithFile(name string, form url.Values) (io.Reader, string) {
var requestBody bytes.Buffer
mpwriter := multipart.NewWriter(&requestBody)
defer mpwriter.Close()
filewriter, _ := mpwriter.CreateFormFile(name, "user-upload")
_, _ = io.Copy(filewriter, file)
for key, items := range form {
item := items[0]
fieldwriter, _ := mpwriter.CreateFormField(key)
_, _ = fieldwriter.Write([]byte(item))
}
return &requestBody, mpwriter.FormDataContentType()
}
type nmatcher struct {
to []db.ContentNewParam
}
func (pm nmatcher) Matches(from interface{}) bool {
val, ok := from.([]db.ContentNewParam)
if !ok {
return false
}
if len(pm.to) != len(val) {
return false
}
for _, in := range pm.to {
exists := false
for _, out := range val {
if in.Name == out.Name && in.Type == out.Type && in.Value == out.Value {
exists = true
}
}
if !exists {
}
}
return true
}
func (pm nmatcher) String() string {
return fmt.Sprintf("%v", pm.to)
}
type umatcher struct {
to []db.ContentUpdateParam
}
func (pm umatcher) Matches(from interface{}) bool {
val, ok := from.([]db.ContentUpdateParam)
if !ok {
return false
}
if len(pm.to) != len(val) {
return false
}
for _, in := range pm.to {
exists := false
for _, out := range val {
if in.ID == out.ID && in.Type == out.Type && in.Value == out.Value {
exists = true
}
}
if !exists {
return false
}
}
return true
}
func (pm umatcher) String() string {
return fmt.Sprintf("%v", pm.to)
}
type fakecontenttype struct {
id, name string
fields int
}
func (u fakecontenttype) ID() string { return u.id }
func (u fakecontenttype) Name() string { return u.name }
func (u fakecontenttype) Fields() (r []valuetype.ValueType) {
for i := 0; i < u.fields; i++ {
var val valuetype.ValueType
r = append(r, val)
}
return
}
func (u fakecontenttype) FieldsWithRefCount() (r int) { return }
type fakecontent struct {
id, typ string
values []value.Value
}
func (fc fakecontent) ID() string { return fc.id }
func (fc fakecontent) Type() string { return fc.typ }
func (fc fakecontent) Values() []value.Value { return fc.values }
func (fc fakecontent) ValueByName(name string) (value.Value, bool) { return nil, false }
func (fc fakecontent) MustValueByName(name string) value.Value { return nil }
type fakecontentlist struct{}
func (cl fakecontentlist) List() (r []contentmodel.Content) { return }
func (cl fakecontentlist) More() (r bool) { return }
func (cl fakecontentlist) Before() (r int) { return }
func TestCreateGood(t *testing.T) {
t.Parallel()
var (
fileURL = "https://e3.evanjon.es/zoidberg.png"
newParams = []db.ContentNewParam{
{"StringSmall", "name", "content name"},
{"StringBig", "short", "content short desc"},
{"InputHTML", "desc", "content desc"},
{"File", "image", fileURL},
}
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"StringSmall-name": {"content name"},
"StringBig-short": {"content short desc"},
"InputHTML-desc": {"content desc"},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentNew(s, ct, nmatcher{newParams}).Return(c, nil).AnyTimes()
e3.EXPECT().Upload(gomock.Any(), false, gomock.Any(), gomock.Any()).Return(fileURL, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookNew).Return().AnyTimes()
bod, headerCT := bodyWithFile("File-image", form)
req, _ := http.NewRequest("POST", ts.URL, bod)
req.Header.Set("Content-Type", headerCT)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestUpdateGood(t *testing.T) {
t.Parallel()
var (
fileURL = "https://e3.evanjon.es/zoidberg.png"
newParams = []db.ContentNewParam{
{"StringBig", "meta", "some meta description"},
{"File", "image", fileURL},
}
updateParams = []db.ContentUpdateParam{
{"1", "StringSmall", "content name"},
{"2", "StringBig", "content short desc"},
{"3", "InputHTML", "content desc"},
}
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"content": {c.ID()},
"method": {"PATCH"},
"StringBig-meta": {"some meta description"},
"value_update_StringSmall-1": {"content name"},
"value_update_StringBig-2": {"content short desc"},
"value_update_InputHTML-3": {"content desc"},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
db.EXPECT().ContentUpdate(s, ct, c, nmatcher{newParams}, umatcher{updateParams}).Return(c, nil).AnyTimes()
e3.EXPECT().Upload(gomock.Any(), false, gomock.Any(), gomock.Any()).Return(fileURL, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookUpdate).Return().AnyTimes()
bod, headerCT := bodyWithFile("File-image", form)
req, _ := http.NewRequest("POST", ts.URL, bod)
req.Header.Set("Content-Type", headerCT)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestUpdateGood2(t *testing.T) {
t.Parallel()
var (
fileURL = "/zoidberg.png"
newParams = []db.ContentNewParam{
{"StringBig", "meta", "some meta description"},
}
updateParams = []db.ContentUpdateParam{
{"1", "StringSmall", "content name"},
{"2", "StringBig", "content short desc"},
{"3", "InputHTML", "content desc"},
{"4", "File", "/file" + fileURL},
}
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"content": {c.ID()},
"method": {"PATCH"},
"StringBig-meta": {"some meta description"},
"value_update_StringSmall-1": {"content name"},
"value_update_StringBig-2": {"content short desc"},
"value_update_InputHTML-3": {"content desc"},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
db.EXPECT().ContentUpdate(s, ct, c, nmatcher{newParams}, umatcher{updateParams}).Return(c, nil).AnyTimes()
e3.EXPECT().Upload(gomock.Any(), false, gomock.Any(), gomock.Any()).Return(fileURL, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookUpdate).Return().AnyTimes()
bod, headerCT := bodyWithFile("value_update_File-4-image", form)
req, _ := http.NewRequest("POST", ts.URL, bod)
req.Header.Set("Content-Type", headerCT)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestServeGood(t *testing.T) {
t.Parallel()
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"content": {c.ID()},
"method": {"GET"},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookNew).Return().AnyTimes()
req, _ := http.NewRequest("POST", ts.URL,
strings.NewReader(form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestServeGood2(t *testing.T) {
t.Parallel()
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"content": {c.ID()},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookNew).Return().AnyTimes()
req, _ := http.NewRequest("GET", ts.URL+"?"+form.Encode(), nil)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestServeGood3(t *testing.T) {
t.Parallel()
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookNew).Return().AnyTimes()
req, _ := http.NewRequest("GET", fmt.Sprintf("%s/content/%s/%s/%s", ts.URL, s.ID(), ct.ID(), c.ID()), nil)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestDeleteGood(t *testing.T) {
t.Parallel()
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
c = fakecontent{uuid.New().String(), ct.ID(), nil}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"content": {c.ID()},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentGet(s, ct, c.ID()).Return(c, nil).AnyTimes()
db.EXPECT().ContentDelete(s, ct, c).Return(nil).AnyTimes()
h.EXPECT().Do(s, c, webhook.HookDelete).Return().AnyTimes()
req, _ := http.NewRequest("DELETE", ts.URL+"?"+form.Encode(), nil)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestSearchGood(t *testing.T) {
t.Parallel()
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
cl = fakecontentlist{}
form = url.Values{
"space": {s.ID()},
"contenttype": {ct.ID()},
"field": {"name"},
"query": {"garfield"},
}
)
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(ct, nil).AnyTimes()
db.EXPECT().ContentSearch(s, ct, "name", "garfield", 0).Return(cl, nil).AnyTimes()
req, _ := http.NewRequest("GET", ts.URL+"?"+form.Encode(), nil)
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, http.StatusOK)
}
func TestBad(t *testing.T) {
t.Parallel()
var (
err = errors.New("placeholder")
u = userT.NewMock(uuid.New().String(), uuid.New().String()).SetPass(uuid.New().String())
s = spaceT.NewMock(uuid.New().String(), uuid.New().String(), uuid.New().String())
ct = fakecontenttype{uuid.New().String(), uuid.New().String(), 3}
// cl = fakecontentlist{}
)
type spec struct {
sc int
err error
form url.Values
mock func(*content.MockDBer, *content.MockE3er, *content.MockHooker)
}
tests := []spec{
// No user.
{
http.StatusBadRequest,
content.ErrNoLogin,
url.Values{
"method": {"GET"},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoLogin,
url.Values{
"method": {"GET"},
"query": {"placeholder"},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoLogin,
url.Values{
"method": {"PATCH"},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoLogin,
url.Values{
"method": {"DELETE"},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoLogin,
url.Values{
"method": {"POST"},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(nil, err).AnyTimes()
},
},
// No space.
{
http.StatusBadRequest,
content.ErrNoSpace,
url.Values{
"method": {"GET"},
"space": {s.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoSpace,
url.Values{
"method": {"GET"},
"query": {"placeholder"},
"space": {s.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoSpace,
url.Values{
"method": {"PATCH"},
"space": {s.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoSpace,
url.Values{
"method": {"DELETE"},
"space": {s.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoSpace,
url.Values{
"method": {"POST"},
"space": {s.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(nil, err).AnyTimes()
},
},
// No content type
{
http.StatusBadRequest,
content.ErrNoCT,
url.Values{
"method": {"GET"},
"space": {s.ID()},
"contenttype": {ct.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoCT,
url.Values{
"method": {"GET"},
"query": {"placeholder"},
"space": {s.ID()},
"contenttype": {ct.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoCT,
url.Values{
"method": {"PATCH"},
"space": {s.ID()},
"contenttype": {ct.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoCT,
url.Values{
"method": {"DELETE"},
"space": {s.ID()},
"contenttype": {ct.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(nil, err).AnyTimes()
},
},
{
http.StatusBadRequest,
content.ErrNoCT,
url.Values{
"method": {"POST"},
"space": {s.ID()},
"contenttype": {ct.ID()},
},
func(db *content.MockDBer, e3 *content.MockE3er, h *content.MockHooker) {
db.EXPECT().UserGet(u.Name(), u.Pass()).Return(u, nil).AnyTimes()
db.EXPECT().SpaceGet(u, s.ID()).Return(s, nil).AnyTimes()
db.EXPECT().ContentTypeGet(s, ct.ID()).Return(nil, err).AnyTimes()
},
},
}
for _, test := range tests {
var (
ctrl = gomock.NewController(t)
db = content.NewMockDBer(ctrl)
e3 = content.NewMockE3er(ctrl)
h = content.NewMockHooker(ctrl)
l = log.New(os.Stdout, "", 0)
ts = httptest.NewServer(content.New(c.New(l, db, true, "test"), l, db, e3, h, ""))
)
test.mock(db, e3, h)
req, _ := http.NewRequest("POST", ts.URL,
strings.NewReader(test.form.Encode()))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.SetBasicAuth(u.Name(), u.Pass())
res, _ := http.DefaultClient.Do(req)
assert.Equal(t, res.StatusCode, test.sc)
}
}