@@ -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