Skip to content

Commit

Permalink
Refactor POST tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Acconut committed Mar 1, 2024
1 parent 00faad7 commit 5a210a3
Showing 1 changed file with 153 additions and 214 deletions.
367 changes: 153 additions & 214 deletions pkg/handler/post_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -545,219 +545,158 @@ func TestPost(t *testing.T) {
})
})

completeUploadTests := []struct {
name string
httpTest httpTest
response []httptestrecorder.InformationalResponse
}{
{
name: "experimentalProtocol-draft-02 Complete Upload Test",
httpTest: httpTest{
Method: "POST",
ReqHeader: map[string]string{
"Upload-Draft-Interop-Version": "4",
"Upload-Complete": "?1",
"Content-Type": "text/plain; charset=utf-8",
"Content-Disposition": "attachment; filename=hello.txt",
},
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": "4",
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
},
response: []httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{"4"},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
},
},

{
name: "experimentalProtocol-draft-01 Complete Upload Test with Upload-Length",
httpTest: httpTest{
Method: "POST",
ReqHeader: map[string]string{
"Upload-Draft-Interop-Version": "3",
"Upload-Incomplete": "?0",
"Content-Type": "text/plain; charset=utf-8",
"Content-Disposition": "attachment; filename=hello.txt",
},
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": "3",
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
},
response: []httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{"3"},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
},
},
}

for _, tc := range completeUploadTests {
SubTest(t, tc.name, func(t *testing.T, store *MockFullDataStore, _ *StoreComposer) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
locker := NewMockFullLocker(ctrl)
lock := NewMockFullLock(ctrl)
upload := NewMockFullUpload(ctrl)

gomock.InOrder(
store.EXPECT().NewUpload(gomock.Any(), FileInfo{
SizeIsDeferred: false,
Size: 11,
MetaData: map[string]string{
"filename": "hello.txt",
"filetype": "text/plain",
},
}).Return(upload, nil),
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
ID: "foo",
SizeIsDeferred: false,
Size: 11,
MetaData: map[string]string{
"filename": "hello.txt",
"filetype": "text/plain",
},
}, nil),
locker.EXPECT().NewLock("foo").Return(lock, nil),
lock.EXPECT().Lock(gomock.Any(), gomock.Any()).Return(nil),
upload.EXPECT().WriteChunk(gomock.Any(), int64(0), NewReaderMatcher("hello world")).Return(int64(11), nil),
upload.EXPECT().FinishUpload(gomock.Any()).Return(nil),
lock.EXPECT().Unlock().Return(nil),
)

composer := NewStoreComposer()
composer.UseCore(store)
composer.UseLocker(locker)

handler, _ := NewHandler(Config{
StoreComposer: composer,
BasePath: "/files/",
EnableExperimentalProtocol: true,
SubTest(t, "ExperimentalProtocol", func(t *testing.T, _ *MockFullDataStore, _ *StoreComposer) {
for _, interopVersion := range []string{"3", "4"} {
SubTest(t, "InteropVersion"+interopVersion, func(t *testing.T, _ *MockFullDataStore, _ *StoreComposer) {
SubTest(t, "CompleteUpload", func(t *testing.T, store *MockFullDataStore, _ *StoreComposer) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
locker := NewMockFullLocker(ctrl)
lock := NewMockFullLock(ctrl)
upload := NewMockFullUpload(ctrl)

gomock.InOrder(
store.EXPECT().NewUpload(gomock.Any(), FileInfo{
SizeIsDeferred: false,
Size: 11,
MetaData: map[string]string{
"filename": "hello.txt",
"filetype": "text/plain",
},
}).Return(upload, nil),
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
ID: "foo",
SizeIsDeferred: false,
Size: 11,
MetaData: map[string]string{
"filename": "hello.txt",
"filetype": "text/plain",
},
}, nil),
locker.EXPECT().NewLock("foo").Return(lock, nil),
lock.EXPECT().Lock(gomock.Any(), gomock.Any()).Return(nil),
upload.EXPECT().WriteChunk(gomock.Any(), int64(0), NewReaderMatcher("hello world")).Return(int64(11), nil),
upload.EXPECT().FinishUpload(gomock.Any()).Return(nil),
lock.EXPECT().Unlock().Return(nil),
)

composer := NewStoreComposer()
composer.UseCore(store)
composer.UseLocker(locker)

handler, _ := NewHandler(Config{
StoreComposer: composer,
BasePath: "/files/",
EnableExperimentalProtocol: true,
})

reqHeaders := map[string]string{
"Upload-Draft-Interop-Version": interopVersion,
"Content-Type": "text/plain; charset=utf-8",
"Content-Disposition": "attachment; filename=hello.txt",
}

if interopVersion == "3" {
reqHeaders["Upload-Incomplete"] = "?0"

} else if interopVersion == "4" {
reqHeaders["Upload-Complete"] = "?1"
}

res := (&httpTest{
Method: "POST",
ReqHeader: reqHeaders,
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": interopVersion,
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
}).Run(handler, t)

a := assert.New(t)
a.Equal([]httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{interopVersion},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
}, res.InformationalResponses)
})

SubTest(t, "IncompleteUpload", func(t *testing.T, store *MockFullDataStore, _ *StoreComposer) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
locker := NewMockFullLocker(ctrl)
lock := NewMockFullLock(ctrl)
upload := NewMockFullUpload(ctrl)

gomock.InOrder(
store.EXPECT().NewUpload(gomock.Any(), FileInfo{
SizeIsDeferred: true,
MetaData: map[string]string{},
}).Return(upload, nil),
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
ID: "foo",
SizeIsDeferred: true,
}, nil),
locker.EXPECT().NewLock("foo").Return(lock, nil),
lock.EXPECT().Lock(gomock.Any(), gomock.Any()).Return(nil),
upload.EXPECT().WriteChunk(gomock.Any(), int64(0), NewReaderMatcher("hello world")).Return(int64(11), nil),
lock.EXPECT().Unlock().Return(nil),
)

composer := NewStoreComposer()
composer.UseCore(store)
composer.UseLocker(locker)
composer.UseLengthDeferrer(store)

handler, _ := NewHandler(Config{
StoreComposer: composer,
BasePath: "/files/",
EnableExperimentalProtocol: true,
})

reqHeaders := map[string]string{
"Upload-Draft-Interop-Version": interopVersion,
}

if interopVersion == "3" {
reqHeaders["Upload-Incomplete"] = "?1"

} else if interopVersion == "4" {
reqHeaders["Upload-Complete"] = "?0"
}

res := (&httpTest{
Method: "POST",
ReqHeader: reqHeaders,
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": interopVersion,
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
}).Run(handler, t)

a := assert.New(t)
a.Equal([]httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{interopVersion},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
}, res.InformationalResponses)
})
})

res := (&tc.httpTest).Run(handler, t)
a := assert.New(t)
a.Equal(tc.response, res.InformationalResponses)
})
}

incompleteUploadTests := []struct {
name string
httpTest httpTest
response []httptestrecorder.InformationalResponse
}{
{
name: "experimentalProtocol-draft-01 Incomplete Upload Test with Upload-Length",
httpTest: httpTest{
Method: "POST",
ReqHeader: map[string]string{
"Upload-Draft-Interop-Version": "3",
"Upload-Incomplete": "?1",
},
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": "3",
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
},
response: []httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{"3"},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
},
},
{
name: "experimentalProtocol-draft-02 Incomplete Upload Test",
httpTest: httpTest{
Method: "POST",
ReqHeader: map[string]string{
"Upload-Draft-Interop-Version": "4",
"Upload-Complete": "?0",
},
ReqBody: strings.NewReader("hello world"),
Code: http.StatusCreated,
ResHeader: map[string]string{
"Upload-Draft-Interop-Version": "4",
"Location": "http://tus.io/files/foo",
"Upload-Offset": "11",
},
},
response: []httptestrecorder.InformationalResponse{
{
Code: 104,
Header: http.Header{
"Upload-Draft-Interop-Version": []string{"4"},
"Location": []string{"http://tus.io/files/foo"},
"X-Content-Type-Options": []string{"nosniff"},
},
},
},
},
}

for _, tc := range incompleteUploadTests {
SubTest(t, tc.name, func(t *testing.T, store *MockFullDataStore, _ *StoreComposer) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
locker := NewMockFullLocker(ctrl)
lock := NewMockFullLock(ctrl)
upload := NewMockFullUpload(ctrl)

gomock.InOrder(
store.EXPECT().NewUpload(gomock.Any(), FileInfo{
SizeIsDeferred: true,
MetaData: map[string]string{},
}).Return(upload, nil),
upload.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
ID: "foo",
SizeIsDeferred: true,
}, nil),
locker.EXPECT().NewLock("foo").Return(lock, nil),
lock.EXPECT().Lock(gomock.Any(), gomock.Any()).Return(nil),
upload.EXPECT().WriteChunk(gomock.Any(), int64(0), NewReaderMatcher("hello world")).Return(int64(11), nil),
lock.EXPECT().Unlock().Return(nil),
)

composer := NewStoreComposer()
composer.UseCore(store)
composer.UseLocker(locker)
composer.UseLengthDeferrer(store)

handler, _ := NewHandler(Config{
StoreComposer: composer,
BasePath: "/files/",
EnableExperimentalProtocol: true,
})

res := (&tc.httpTest).Run(handler, t)
a := assert.New(t)
a.Equal(tc.response, res.InformationalResponses)
})
}
}
})
}

0 comments on commit 5a210a3

Please sign in to comment.