-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
updated implementation to comply with S3 Read/Write API endpoint spec. #14
Changes from 2 commits
1904d02
e2ab606
96515fe
44d3c2d
4f449ba
6929ab2
c38916c
425da23
88b96ab
db37964
a1058f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,8 @@ import ( | |
|
||
const ( | ||
ExpectedContentType = "application/json" | ||
EmptyResourcePath = "" | ||
NonEmptyResourcePath = "/notempty" | ||
) | ||
|
||
func TestAddAdminHandlers(t *testing.T) { | ||
|
@@ -86,11 +88,47 @@ func TestAddAdminHandlers(t *testing.T) { | |
}) | ||
} | ||
|
||
func TestMethodHandlerAcceptsNonEmptyResourcePath(t *testing.T) { | ||
r := mux.NewRouter() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Having re-read these tests, I think that they're testing the same as the other tests unnecessarily. I think going down the named routes route would actually be better to test the setting of the resource path. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't mind changing but I am worried whether there will be a quorum? Other reviewers may think otherwise... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could take out the additional tests and see if coverage goes down if you aren't convinced. Also Pete just told me that you can see inline the coverage if you use Atom as an editor - I am going to check it out now :) |
||
mw := &mockWriter{} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, NonEmptyResourcePath) | ||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("PUT", withNonEmptyResourcePath("/22f53313-85c6-46b2-94e7-cfde9322f26c"), "PAYLOAD")) | ||
assert.Equal(t, 201, rec.Code) | ||
} | ||
|
||
func TestCountHandlerAcceptsNonEmptyResourcePath(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), NonEmptyResourcePath) | ||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("GET", withNonEmptyResourcePath("/__count"), "")) | ||
assert.Equal(t, 200, rec.Code) | ||
} | ||
|
||
func TestIdsHandlerAcceptsNonEmptyResourcePath(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), NonEmptyResourcePath) | ||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("GET", withNonEmptyResourcePath("/__ids"), "")) | ||
assert.Equal(t, 200, rec.Code) | ||
} | ||
func TestGetAllHandlerAcceptsNonEmptyResourcePath(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), NonEmptyResourcePath) | ||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("GET", withNonEmptyResourcePath("/"), "")) | ||
assert.Equal(t, 200, rec.Code) | ||
} | ||
|
||
func TestWriteHandlerNewContentReturnsCreated(t *testing.T) { | ||
r := mux.NewRouter() | ||
mw := &mockWriter{} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("PUT", "/22f53313-85c6-46b2-94e7-cfde9322f26c", "PAYLOAD")) | ||
|
@@ -102,11 +140,15 @@ func TestWriteHandlerNewContentReturnsCreated(t *testing.T) { | |
assert.Equal(t, "{\"message\":\"CREATED\"}", rec.Body.String()) | ||
} | ||
|
||
func withNonEmptyResourcePath(endpoint string) string { | ||
return NonEmptyResourcePath + endpoint | ||
} | ||
|
||
func TestWriteHandlerUpdateContentReturnsOK(t *testing.T) { | ||
r := mux.NewRouter() | ||
mw := &mockWriter{} | ||
mr := &mockReader{found: true} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("PUT", "/89d15f70-640d-11e4-9803-0800200c9a66", "PAYLOAD")) | ||
|
@@ -123,7 +165,7 @@ func TestWriterHandlerFailReadingBody(t *testing.T) { | |
r := mux.NewRouter() | ||
mw := &mockWriter{} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequestBodyFail("PUT", "/22f53313-85c6-46b2-94e7-cfde9322f26c")) | ||
|
@@ -135,19 +177,19 @@ func TestWriterHandlerFailWrite(t *testing.T) { | |
r := mux.NewRouter() | ||
mw := &mockWriter{returnError: errors.New("error writing")} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("PUT", "/22f53313-85c6-46b2-94e7-cfde9322f26c", "PAYLOAD")) | ||
assert.Equal(t, 500, rec.Code) | ||
assert.Equal(t, "{\"message\":\"Unknown internal error\"}", rec.Body.String()) | ||
assert.Equal(t, 503, rec.Code) | ||
assert.Equal(t, "{\"message\":\"Service currently unavailable\"}", rec.Body.String()) | ||
} | ||
|
||
func TestWriterHandlerDeleteReturnsOK(t *testing.T) { | ||
r := mux.NewRouter() | ||
mw := &mockWriter{} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("DELETE", "/22f53313-85c6-46b2-94e7-cfde9322f26c", "")) | ||
|
@@ -156,94 +198,94 @@ func TestWriterHandlerDeleteReturnsOK(t *testing.T) { | |
assert.Empty(t, rec.Body.String()) | ||
} | ||
|
||
func TestWriterHandlerDeleteFailsReturns500(t *testing.T) { | ||
func TestWriterHandlerDeleteFailsReturns503(t *testing.T) { | ||
r := mux.NewRouter() | ||
mw := &mockWriter{returnError: errors.New("Some error from writer")} | ||
mr := &mockReader{} | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}) | ||
Handlers(r, NewWriterHandler(mw, mr), ReaderHandler{}, EmptyResourcePath) | ||
|
||
rec := httptest.NewRecorder() | ||
r.ServeHTTP(rec, newRequest("DELETE", "/22f53313-85c6-46b2-94e7-cfde9322f26c", "")) | ||
assert.Equal(t, 500, rec.Code) | ||
assert.Equal(t, "{\"message\":\"Unknown internal error\"}", rec.Body.String()) | ||
assert.Equal(t, 503, rec.Code) | ||
assert.Equal(t, "{\"message\":\"Service currently unavailable\"}", rec.Body.String()) | ||
} | ||
|
||
func TestReadHandlerForUUID(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{payload: "Some content", returnCT: "return/type"} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 200, "Some content", "return/type") | ||
} | ||
|
||
func TestReadHandlerForUUIDAndNoContentType(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{payload: "Some content"} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 200, "Some content", "") | ||
} | ||
|
||
func TestReadHandlerForUUIDNotFound(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 404, "{\"message\":\"Item not found\"}", ExpectedContentType) | ||
} | ||
|
||
func TestReadHandlerForErrorFromReader(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{payload: "something came back but", returnError: errors.New("Some error from reader though")} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 500, "{\"message\":\"Unknown internal error\"}", ExpectedContentType) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 503, "{\"message\":\"Service currently unavailable\"}", ExpectedContentType) | ||
} | ||
|
||
func TestReadHandlerForErrorReadingBody(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{rc: &mockReaderCloser{err: errors.New("Some error")}} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
|
||
assertRequestAndResponseFromRouter(t, r, "/22f53313-85c6-46b2-94e7-cfde9322f26c", 502, "{\"message\":\"Error while communicating to other service\"}", ExpectedContentType) | ||
} | ||
|
||
func TestReadHandlerCountOK(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{count: 1337} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/__count", 200, "1337", ExpectedContentType) | ||
} | ||
|
||
func TestReadHandlerCountFailsReturnsInternalServerError(t *testing.T) { | ||
func TestReadHandlerCountFailsReturnsServiceUnavailable(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{returnError: errors.New("Some error from reader though")} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
assertRequestAndResponseFromRouter(t, r, "/__count", 500, "{\"message\":\"Unknown internal error\"}", ExpectedContentType) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/__count", 503, "{\"message\":\"Service currently unavailable\"}", ExpectedContentType) | ||
} | ||
|
||
func TestReaderHandlerIdsOK(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{payload: "PAYLOAD"} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/__ids", 200, "PAYLOAD", "application/octet-stream") | ||
} | ||
|
||
func TestReaderHandlerIdsFailsReturnsInternalServerError(t *testing.T) { | ||
func TestReaderHandlerIdsFailsReturnsServiceUnavailable(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{returnError: errors.New("Some error from reader though")} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
assertRequestAndResponseFromRouter(t, r, "/__ids", 500, "{\"message\":\"Unknown internal error\"}", ExpectedContentType) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/__ids", 503, "{\"message\":\"Service currently unavailable\"}", ExpectedContentType) | ||
} | ||
|
||
func TestHandleGetAllOK(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{payload: "PAYLOAD"} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/", 200, "PAYLOAD", "application/octet-stream") | ||
} | ||
|
||
func TestHandleGetAllFailsReturnsInternalServerError(t *testing.T) { | ||
func TestHandleGetAllFailsReturnsServiceUnavailable(t *testing.T) { | ||
r := mux.NewRouter() | ||
mr := &mockReader{returnError: errors.New("Some error from reader though")} | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr)) | ||
assertRequestAndResponseFromRouter(t, r, "/", 500, "{\"message\":\"Unknown internal error\"}", ExpectedContentType) | ||
Handlers(r, WriterHandler{}, NewReaderHandler(mr), EmptyResourcePath) | ||
assertRequestAndResponseFromRouter(t, r, "/", 503, "{\"message\":\"Service currently unavailable\"}", ExpectedContentType) | ||
} | ||
|
||
func assertRequestAndResponseFromRouter(t testing.TB, r *mux.Router, url string, expectedStatus int, expectedBody string, expectedContentType string) *httptest.ResponseRecorder { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing test for
/__count
,/__ids
and/
.