Skip to content

Commit dc7d699

Browse files
committed
Added tests
1 parent 9f36e90 commit dc7d699

File tree

4 files changed

+242
-10
lines changed

4 files changed

+242
-10
lines changed

internal/storage/FileServing.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ const (
364364
)
365365

366366
// ReplaceFile replaces the file content of fileId with the content of newFileContentId
367+
// If delete is true, the NEW file will be deleted.
367368
// Replacing e2e encrypted files is NOT possible
368369
func ReplaceFile(fileId, newFileContentId string, delete bool) (models.File, error) {
369370
file, ok := GetFile(fileId)

internal/storage/FileServing_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,3 +788,91 @@ func TestDeleteAllEncrypted(t *testing.T) {
788788
test.IsEqualBool(t, ok, true)
789789
test.IsEqualBool(t, data.UnlimitedTime, true)
790790
}
791+
792+
func TestReplaceFile(t *testing.T) {
793+
originalFile := models.File{
794+
Id: "originalfiletest",
795+
Name: "old.txt",
796+
Size: "1KB",
797+
SHA1: "replacetest1",
798+
ContentType: "text/plain",
799+
UnlimitedDownloads: true,
800+
UnlimitedTime: true,
801+
AwsBucket: "",
802+
SizeBytes: 1024,
803+
Encryption: models.EncryptionInfo{
804+
IsEncrypted: false,
805+
IsEndToEndEncrypted: false,
806+
DecryptionKey: nil,
807+
Nonce: nil,
808+
},
809+
}
810+
811+
newFile := models.File{
812+
Id: "newfiletest",
813+
Name: "new.txt",
814+
Size: "2KB",
815+
SHA1: "replacetest2",
816+
ContentType: "text/plain2",
817+
UnlimitedDownloads: true,
818+
UnlimitedTime: true,
819+
AwsBucket: "",
820+
SizeBytes: 2048,
821+
Encryption: models.EncryptionInfo{
822+
IsEncrypted: true,
823+
IsEndToEndEncrypted: false,
824+
DecryptionKey: []byte("key"),
825+
Nonce: []byte("nonce"),
826+
},
827+
}
828+
829+
e2eFile := models.File{
830+
Id: "e2eFile",
831+
Name: "e2eFile",
832+
Size: "1KB",
833+
UnlimitedDownloads: true,
834+
UnlimitedTime: true,
835+
SHA1: "replacetest3",
836+
Encryption: models.EncryptionInfo{
837+
IsEncrypted: true,
838+
IsEndToEndEncrypted: true,
839+
},
840+
}
841+
database.SaveMetaData(originalFile)
842+
_, ok := database.GetMetaDataById(originalFile.Id)
843+
test.IsEqualBool(t, ok, true)
844+
_, ok = GetFile(originalFile.Id)
845+
test.IsEqualBool(t, ok, true)
846+
database.SaveMetaData(newFile)
847+
_, ok = database.GetMetaDataById(newFile.Id)
848+
test.IsEqualBool(t, ok, true)
849+
database.SaveMetaData(e2eFile)
850+
_, ok = database.GetMetaDataById(e2eFile.Id)
851+
test.IsEqualBool(t, ok, true)
852+
_, err := ReplaceFile("invalidfile", originalFile.Id, false)
853+
test.IsNotNil(t, err)
854+
_, err = ReplaceFile(originalFile.Id, "invalidfile", false)
855+
test.IsNotNil(t, err)
856+
_, err = ReplaceFile(originalFile.Id, e2eFile.Id, false)
857+
test.IsNotNil(t, err)
858+
859+
_, err = ReplaceFile(originalFile.Id, newFile.Id, false)
860+
test.IsNil(t, err)
861+
file, ok := GetFile(originalFile.Id)
862+
test.IsEqualBool(t, ok, true)
863+
test.IsEqualString(t, file.Name, newFile.Name)
864+
test.IsEqualString(t, file.SHA1, newFile.SHA1)
865+
test.IsEqualString(t, file.ContentType, newFile.ContentType)
866+
test.IsEqualString(t, file.AwsBucket, newFile.AwsBucket)
867+
test.IsEqualString(t, file.Size, newFile.Size)
868+
test.IsEqualInt64(t, file.SizeBytes, newFile.SizeBytes)
869+
test.IsEqual(t, file.Encryption, newFile.Encryption)
870+
_, ok = GetFile(newFile.Id)
871+
test.IsEqualBool(t, ok, true)
872+
873+
_, err = ReplaceFile(originalFile.Id, newFile.Id, true)
874+
_, ok = GetFile(originalFile.Id)
875+
test.IsEqualBool(t, ok, true)
876+
_, ok = GetFile(newFile.Id)
877+
test.IsEqualBool(t, ok, false)
878+
}

internal/test/testconfiguration/TestConfiguration.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,19 @@ func Create(initFiles bool) {
6464
database.Close()
6565

6666
if initFiles {
67-
os.MkdirAll(dataDir, 0777)
68-
os.WriteFile(dataDir+"/a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0", []byte("123"), 0777)
69-
os.WriteFile(dataDir+"/a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd1", []byte("123"), 0777)
70-
os.WriteFile(dataDir+"/c4f9375f9834b4e7f0a528cc65c055702bf5f24a", []byte("456"), 0777)
71-
os.WriteFile(dataDir+"/e017693e4a04a59d0b0f400fe98177fe7ee13cf7", []byte("789"), 0777)
72-
os.WriteFile(dataDir+"/2341354656543213246465465465432456898794", []byte("abc"), 0777)
73-
os.WriteFile(dataDir+"/03cfd743661f07975fa2f1220c5194cbaff48451", []byte("def"), 0777)
74-
os.WriteFile(dataDir+"/pendingdeletion", []byte("ghi"), 0777)
75-
os.WriteFile(dataDir+"/unlimitedtest", []byte("def"), 0777)
76-
os.WriteFile(baseDir+"/fileupload.jpg", []byte("abc"), 0777)
67+
_ = os.MkdirAll(dataDir, 0777)
68+
_ = os.WriteFile(dataDir+"/a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0", []byte("123"), 0777)
69+
_ = os.WriteFile(dataDir+"/a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd1", []byte("123"), 0777)
70+
_ = os.WriteFile(dataDir+"/c4f9375f9834b4e7f0a528cc65c055702bf5f24a", []byte("456"), 0777)
71+
_ = os.WriteFile(dataDir+"/e017693e4a04a59d0b0f400fe98177fe7ee13cf7", []byte("789"), 0777)
72+
_ = os.WriteFile(dataDir+"/2341354656543213246465465465432456898794", []byte("abc"), 0777)
73+
_ = os.WriteFile(dataDir+"/03cfd743661f07975fa2f1220c5194cbaff48451", []byte("def"), 0777)
74+
_ = os.WriteFile(dataDir+"/replacetest1", []byte("abc"), 0777)
75+
_ = os.WriteFile(dataDir+"/replacetest2", []byte("abc"), 0777)
76+
_ = os.WriteFile(dataDir+"/replacetest3", []byte("abc"), 0777)
77+
_ = os.WriteFile(dataDir+"/pendingdeletion", []byte("ghi"), 0777)
78+
_ = os.WriteFile(dataDir+"/unlimitedtest", []byte("def"), 0777)
79+
_ = os.WriteFile(baseDir+"/fileupload.jpg", []byte("abc"), 0777)
7780
}
7881
}
7982

internal/webserver/api/Api_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,3 +1613,143 @@ func TestMinorFunctions(t *testing.T) {
16131613
outputFileJson(nil, models.File{})
16141614
sendError(nil, 0, "none")
16151615
}
1616+
1617+
func testReplaceFileCall(t *testing.T, apiKey string, fileTarget, fileOrigin string, deleteFile bool, resultCode int, expectedResponse string) {
1618+
t.Helper()
1619+
const apiUrl = "/files/replace"
1620+
const headerFileIdTarget = "id"
1621+
const headerFileIdOrigin = "idNewContent"
1622+
const headerDeleteFile = "deleteNewFile"
1623+
headers := []test.Header{{}}
1624+
if fileTarget != "" {
1625+
headers = append(headers, test.Header{Name: headerFileIdTarget, Value: fileTarget})
1626+
}
1627+
if fileOrigin != "" {
1628+
headers = append(headers, test.Header{Name: headerFileIdOrigin, Value: fileOrigin})
1629+
}
1630+
if deleteFile {
1631+
headers = append(headers, test.Header{Name: headerDeleteFile, Value: "true"})
1632+
}
1633+
w, r := getRecorder(apiUrl, apiKey, headers)
1634+
Process(w, r)
1635+
test.IsEqualInt(t, w.Code, resultCode)
1636+
if expectedResponse != "" {
1637+
test.ResponseBodyContains(t, w, expectedResponse)
1638+
}
1639+
1640+
defer test.ExpectPanic(t)
1641+
apiRestoreFile(w, &paramAuthCreate{}, models.User{Id: 7})
1642+
}
1643+
1644+
func TestFileReplace(t *testing.T) {
1645+
originalFile := models.File{
1646+
Id: "originalfiletest",
1647+
Name: "old.txt",
1648+
Size: "1KB",
1649+
SHA1: "replacetest1",
1650+
ContentType: "text/plain",
1651+
UnlimitedDownloads: true,
1652+
UnlimitedTime: true,
1653+
AwsBucket: "",
1654+
SizeBytes: 1024,
1655+
UserId: idUser,
1656+
Encryption: models.EncryptionInfo{
1657+
IsEncrypted: false,
1658+
IsEndToEndEncrypted: false,
1659+
DecryptionKey: nil,
1660+
Nonce: nil,
1661+
},
1662+
}
1663+
1664+
newFile := models.File{
1665+
Id: "newfiletest",
1666+
Name: "new.txt",
1667+
Size: "2KB",
1668+
SHA1: "replacetest2",
1669+
ContentType: "text/plain2",
1670+
UnlimitedDownloads: true,
1671+
UnlimitedTime: true,
1672+
UserId: idUser,
1673+
AwsBucket: "",
1674+
SizeBytes: 2048,
1675+
Encryption: models.EncryptionInfo{
1676+
IsEncrypted: true,
1677+
IsEndToEndEncrypted: false,
1678+
DecryptionKey: []byte("key"),
1679+
Nonce: []byte("nonce"),
1680+
},
1681+
}
1682+
1683+
e2eFile := models.File{
1684+
Id: "e2eFile",
1685+
Name: "e2eFile",
1686+
Size: "1KB",
1687+
UnlimitedDownloads: true,
1688+
UserId: idUser,
1689+
UnlimitedTime: true,
1690+
SHA1: "replacetest3",
1691+
Encryption: models.EncryptionInfo{
1692+
IsEncrypted: true,
1693+
IsEndToEndEncrypted: true,
1694+
},
1695+
}
1696+
adminFile := models.File{
1697+
Id: "adminfile",
1698+
Name: "old.txt",
1699+
Size: "1KB",
1700+
SHA1: "replacetest1",
1701+
ContentType: "text/plain",
1702+
UnlimitedDownloads: true,
1703+
UnlimitedTime: true,
1704+
AwsBucket: "",
1705+
SizeBytes: 1024,
1706+
UserId: idAdmin,
1707+
Encryption: models.EncryptionInfo{
1708+
IsEncrypted: false,
1709+
IsEndToEndEncrypted: false,
1710+
DecryptionKey: nil,
1711+
Nonce: nil,
1712+
},
1713+
}
1714+
1715+
database.SaveMetaData(originalFile)
1716+
_, ok := database.GetMetaDataById(originalFile.Id)
1717+
test.IsEqualBool(t, ok, true)
1718+
database.SaveMetaData(newFile)
1719+
_, ok = database.GetMetaDataById(newFile.Id)
1720+
test.IsEqualBool(t, ok, true)
1721+
database.SaveMetaData(e2eFile)
1722+
_, ok = database.GetMetaDataById(e2eFile.Id)
1723+
test.IsEqualBool(t, ok, true)
1724+
database.SaveMetaData(adminFile)
1725+
_, ok = database.GetMetaDataById(adminFile.Id)
1726+
test.IsEqualBool(t, ok, true)
1727+
1728+
apiKey := testAuthorisation(t, "/files/replace", models.ApiPermReplace)
1729+
testReplaceFileCall(t, apiKey.Id, "", "invalid", false, 400, `{"Result":"error","ErrorMessage":"header id is required"}`)
1730+
testReplaceFileCall(t, apiKey.Id, "invalid", "", false, 400, `{"Result":"error","ErrorMessage":"header idNewContent is required"}`)
1731+
testReplaceFileCall(t, apiKey.Id, "invalid", originalFile.Id, false, 404, `{"Result":"error","ErrorMessage":"Invalid id provided."}`)
1732+
testReplaceFileCall(t, apiKey.Id, originalFile.Id, "invalid", false, 404, `{"Result":"error","ErrorMessage":"Invalid id provided."}`)
1733+
testReplaceFileCall(t, apiKey.Id, originalFile.Id, adminFile.Id, false, 401, `{"Result":"error","ErrorMessage":"No permission to duplicate this file"}`)
1734+
testReplaceFileCall(t, apiKey.Id, adminFile.Id, originalFile.Id, false, 401, `{"Result":"error","ErrorMessage":"No permission to replace this file"}`)
1735+
testReplaceFileCall(t, apiKey.Id, e2eFile.Id, originalFile.Id, false, 400, `{"Result":"error","ErrorMessage":"End-to-End encrypted files cannot be replaced"}`)
1736+
testReplaceFileCall(t, apiKey.Id, originalFile.Id, newFile.Id, false, 200, "")
1737+
1738+
file, ok := database.GetMetaDataById(originalFile.Id)
1739+
test.IsEqualBool(t, ok, true)
1740+
test.IsEqualString(t, file.Name, newFile.Name)
1741+
test.IsEqualString(t, file.SHA1, newFile.SHA1)
1742+
test.IsEqualString(t, file.ContentType, newFile.ContentType)
1743+
test.IsEqualString(t, file.AwsBucket, newFile.AwsBucket)
1744+
test.IsEqualString(t, file.Size, newFile.Size)
1745+
test.IsEqualInt64(t, file.SizeBytes, newFile.SizeBytes)
1746+
test.IsEqual(t, file.Encryption, newFile.Encryption)
1747+
_, ok = storage.GetFile(newFile.Id)
1748+
test.IsEqualBool(t, ok, true)
1749+
testReplaceFileCall(t, apiKey.Id, originalFile.Id, newFile.Id, true, 200, "")
1750+
1751+
_, ok = storage.GetFile(originalFile.Id)
1752+
test.IsEqualBool(t, ok, true)
1753+
_, ok = storage.GetFile(newFile.Id)
1754+
test.IsEqualBool(t, ok, false)
1755+
}

0 commit comments

Comments
 (0)