@@ -7,6 +7,7 @@ package file
77
88import (
99 "context"
10+ "encoding/json"
1011 "os"
1112 "path"
1213 "path/filepath"
@@ -44,13 +45,89 @@ func TestFileOperator_Write(t *testing.T) {
4445 assert .Equal (t , fileContent , data )
4546}
4647
48+ func TestFileOperator_WriteManifestFile (t * testing.T ) {
49+ tempDir := t .TempDir ()
50+ manifestPath := path .Join (tempDir , "manifest.json" )
51+
52+ manifestFiles := map [string ]* model.ManifestFile {
53+ "/etc/nginx/nginx.conf" : {
54+ ManifestFileMeta : & model.ManifestFileMeta {
55+ Name : "/etc/nginx/nginx.conf" ,
56+ Size : 1024 ,
57+ Hash : "6d232d32d44" ,
58+ Referenced : true ,
59+ Unmanaged : false ,
60+ },
61+ },
62+ "/etc/nginx/conf.d/default.conf" : {
63+ ManifestFileMeta : & model.ManifestFileMeta {
64+ Name : "/etc/nginx/conf.d/default.conf" ,
65+ Size : 32342 ,
66+ Hash : "1eh32hd3792hd329" ,
67+ Referenced : true ,
68+ Unmanaged : false ,
69+ },
70+ },
71+ }
72+
73+ fileOperator := NewFileOperator (& sync.RWMutex {})
74+ err := fileOperator .WriteManifestFile (t .Context (), manifestFiles , tempDir , manifestPath )
75+ require .NoError (t , err )
76+
77+ assert .FileExists (t , manifestPath )
78+ assert .NoFileExists (t , manifestPath + ".tmp" )
79+
80+ // Verify the contents can be read back
81+ data , err := os .ReadFile (manifestPath )
82+ require .NoError (t , err )
83+
84+ var readBack map [string ]* model.ManifestFile
85+ err = json .Unmarshal (data , & readBack )
86+ require .NoError (t , err )
87+ assert .Equal (t , manifestFiles , readBack )
88+ }
89+
90+ func TestFileOperator_WriteManifestFile_directoryCreationError (t * testing.T ) {
91+ manifestPath := "/unknown/manifest.json"
92+ manifestDir := "/unknown"
93+
94+ fileOperator := NewFileOperator (& sync.RWMutex {})
95+ err := fileOperator .WriteManifestFile (t .Context (), make (map [string ]* model.ManifestFile ), manifestDir , manifestPath )
96+ require .Error (t , err )
97+ assert .Contains (t , err .Error (), "unable to create directory" )
98+ }
99+
100+ func TestFileOperator_WriteManifestFile_tempFileCreationError (t * testing.T ) {
101+ tempDir := t .TempDir ()
102+
103+ // Create a file where we want to write the manifest
104+ manifestPath := path .Join (tempDir , "manifest.json" )
105+ err := os .WriteFile (manifestPath , []byte ("existing" ), 0o400 ) // readonly
106+ require .NoError (t , err )
107+
108+ // Create readonly directory to prevent temp file creation
109+ err = os .Chmod (tempDir , 0o444 )
110+ require .NoError (t , err )
111+ defer func () {
112+ revertPermissionsError := os .Chmod (tempDir , 0o755 )
113+ require .NoError (t , revertPermissionsError )
114+ }()
115+
116+ fileOperator := NewFileOperator (& sync.RWMutex {})
117+ err = fileOperator .WriteManifestFile (t .Context (), make (map [string ]* model.ManifestFile ), tempDir , manifestPath )
118+ require .Error (t , err )
119+ assert .Contains (t , err .Error (), "failed to open file" )
120+ }
121+
47122func TestFileOperator_WriteManifestFile_fileMissing (t * testing.T ) {
48123 tempDir := t .TempDir ()
49124 manifestPath := "/unknown/manifest.json"
50125
51126 fileOperator := NewFileOperator (& sync.RWMutex {})
52127 err := fileOperator .WriteManifestFile (t .Context (), make (map [string ]* model.ManifestFile ), tempDir , manifestPath )
53- assert .Error (t , err )
128+ require .Error (t , err )
129+
130+ assert .NoFileExists (t , manifestPath + ".tmp" )
54131}
55132
56133func TestFileOperator_MoveFile_fileExists (t * testing.T ) {
0 commit comments