@@ -539,6 +539,237 @@ func (ts *fileTestSuite) TestMoveAndCopyBuffered() {
539539	}
540540}
541541
542+ func  (ts  * fileTestSuite ) TestSize () {
543+ 	contents  :=  "hello world!" 
544+ 	bucketName  :=  "bucki" 
545+ 	objectName  :=  "some/path/file.txt" 
546+ 	server  :=  fakestorage .NewServer (
547+ 		Objects {
548+ 			fakestorage.Object {
549+ 				ObjectAttrs : fakestorage.ObjectAttrs {
550+ 					BucketName :      bucketName ,
551+ 					Name :            objectName ,
552+ 					ContentType :     "text/plain" ,
553+ 					ContentEncoding : "utf8" ,
554+ 				},
555+ 				Content : []byte (contents ),
556+ 			},
557+ 		},
558+ 	)
559+ 	defer  server .Stop ()
560+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
561+ 
562+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
563+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
564+ 
565+ 	size , err  :=  file .Size ()
566+ 	ts .NoError (err , "Size() should not return an error for existing file" )
567+ 	ts .Equal (uint64 (len (contents )), size , "Size should match the content length" )
568+ }
569+ 
570+ func  (ts  * fileTestSuite ) TestSizeError () {
571+ 	bucketName  :=  "bucki" 
572+ 	objectName  :=  "nonexistent.txt" 
573+ 	server  :=  fakestorage .NewServer (Objects {})
574+ 	defer  server .Stop ()
575+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
576+ 
577+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
578+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
579+ 
580+ 	_ , err  =  file .Size ()
581+ 	ts .Error (err , "Size() should return an error for non-existent file" )
582+ }
583+ 
584+ func  (ts  * fileTestSuite ) TestLastModified () {
585+ 	contents  :=  "hello world!" 
586+ 	bucketName  :=  "bucki" 
587+ 	objectName  :=  "some/path/file.txt" 
588+ 	server  :=  fakestorage .NewServer (
589+ 		Objects {
590+ 			fakestorage.Object {
591+ 				ObjectAttrs : fakestorage.ObjectAttrs {
592+ 					BucketName :      bucketName ,
593+ 					Name :            objectName ,
594+ 					ContentType :     "text/plain" ,
595+ 					ContentEncoding : "utf8" ,
596+ 				},
597+ 				Content : []byte (contents ),
598+ 			},
599+ 		},
600+ 	)
601+ 	defer  server .Stop ()
602+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
603+ 
604+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
605+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
606+ 
607+ 	lastMod , err  :=  file .LastModified ()
608+ 	ts .NoError (err , "LastModified() should not return an error for existing file" )
609+ 	ts .NotNil (lastMod , "LastModified should return a non-nil time" )
610+ }
611+ 
612+ func  (ts  * fileTestSuite ) TestLastModifiedError () {
613+ 	bucketName  :=  "bucki" 
614+ 	objectName  :=  "nonexistent.txt" 
615+ 	server  :=  fakestorage .NewServer (Objects {})
616+ 	defer  server .Stop ()
617+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
618+ 
619+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
620+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
621+ 
622+ 	_ , err  =  file .LastModified ()
623+ 	ts .Error (err , "LastModified() should return an error for non-existent file" )
624+ }
625+ 
626+ func  (ts  * fileTestSuite ) TestStat () {
627+ 	contents  :=  "hello world!" 
628+ 	bucketName  :=  "bucki" 
629+ 	objectName  :=  "some/path/file.txt" 
630+ 	server  :=  fakestorage .NewServer (
631+ 		Objects {
632+ 			fakestorage.Object {
633+ 				ObjectAttrs : fakestorage.ObjectAttrs {
634+ 					BucketName :      bucketName ,
635+ 					Name :            objectName ,
636+ 					ContentType :     "text/plain" ,
637+ 					ContentEncoding : "utf8" ,
638+ 				},
639+ 				Content : []byte (contents ),
640+ 			},
641+ 		},
642+ 	)
643+ 	defer  server .Stop ()
644+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
645+ 
646+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
647+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
648+ 
649+ 	fileInfo , err  :=  file .Stat ()
650+ 	ts .NoError (err , "Stat() should not return an error for existing file" )
651+ 	ts .NotNil (fileInfo , "FileInfo should not be nil" )
652+ 	ts .Equal ("file.txt" , fileInfo .Name (), "FileInfo name should match file name" )
653+ 	ts .Equal (int64 (len (contents )), fileInfo .Size (), "FileInfo size should match content length" )
654+ 	ts .False (fileInfo .IsDir (), "FileInfo should indicate file is not a directory" )
655+ 	ts .NotNil (fileInfo .ModTime (), "ModTime should not be nil" )
656+ 	ts .Equal (0644 , int (fileInfo .Mode ()), "Mode should be 0644" )
657+ 	ts .Nil (fileInfo .Sys (), "Sys should return nil" )
658+ }
659+ 
660+ func  (ts  * fileTestSuite ) TestStatError () {
661+ 	bucketName  :=  "bucki" 
662+ 	objectName  :=  "nonexistent.txt" 
663+ 	server  :=  fakestorage .NewServer (Objects {})
664+ 	defer  server .Stop ()
665+ 	fs  :=  NewFileSystem (WithClient (server .Client ()))
666+ 
667+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
668+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
669+ 
670+ 	_ , err  =  file .Stat ()
671+ 	ts .Error (err , "Stat() should return an error for non-existent file" )
672+ }
673+ 
674+ func  (ts  * fileTestSuite ) TestTouchExistingFileWithVersioning () {
675+ 	contents  :=  "hello world!" 
676+ 	bucketName  :=  "bucki" 
677+ 	objectName  :=  "some/path/file.txt" 
678+ 	server  :=  fakestorage .NewServer (
679+ 		Objects {
680+ 			fakestorage.Object {
681+ 				ObjectAttrs : fakestorage.ObjectAttrs {
682+ 					BucketName :      bucketName ,
683+ 					Name :            objectName ,
684+ 					ContentType :     "text/plain" ,
685+ 					ContentEncoding : "utf8" ,
686+ 				},
687+ 				Content : []byte (contents ),
688+ 			},
689+ 		},
690+ 	)
691+ 	defer  server .Stop ()
692+ 	client  :=  server .Client ()
693+ 	
694+ 	// Enable versioning on the bucket manually 
695+ 	ctx  :=  context .Background ()
696+ 	bucket  :=  client .Bucket (bucketName )
697+ 	_ , err  :=  bucket .Update (ctx , storage.BucketAttrsToUpdate {
698+ 		VersioningEnabled : true ,
699+ 	})
700+ 	ts .NoError (err , "Setting versioning should not error" )
701+ 	
702+ 	fs  :=  NewFileSystem (WithClient (client ))
703+ 
704+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
705+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
706+ 
707+ 	// This should use the updateLastModifiedByMoving path since versioning is enabled 
708+ 	err  =  file .Touch ()
709+ 	ts .NoError (err , "Touch() should not return an error for existing file with versioning" )
710+ 	
711+ 	// Check the file still exists and is accessible 
712+ 	exists , err  :=  file .Exists ()
713+ 	ts .NoError (err , "Exists() should not return an error" )
714+ 	ts .True (exists , "File should still exist after Touch with versioning" )
715+ }
716+ 
717+ func  (ts  * fileTestSuite ) TestTouchExistingFileWithoutVersioning () {
718+ 	contents  :=  "hello world!" 
719+ 	bucketName  :=  "bucki" 
720+ 	objectName  :=  "some/path/file.txt" 
721+ 	server  :=  fakestorage .NewServer (
722+ 		Objects {
723+ 			fakestorage.Object {
724+ 				ObjectAttrs : fakestorage.ObjectAttrs {
725+ 					BucketName :      bucketName ,
726+ 					Name :            objectName ,
727+ 					ContentType :     "text/plain" ,
728+ 					ContentEncoding : "utf8" ,
729+ 				},
730+ 				Content : []byte (contents ),
731+ 			},
732+ 		},
733+ 	)
734+ 	defer  server .Stop ()
735+ 	client  :=  server .Client ()
736+ 	fs  :=  NewFileSystem (WithClient (client ))
737+ 
738+ 	file , err  :=  fs .NewFile (bucketName , "/" + objectName )
739+ 	ts .Require ().NoError (err , "Shouldn't fail creating new file" )
740+ 
741+ 	// This should use the updateLastModifiedByAttrUpdate path since versioning is not enabled 
742+ 	err  =  file .Touch ()
743+ 	ts .NoError (err , "Touch() should not return an error for existing file without versioning" )
744+ 	
745+ 	// Check the file still exists and is accessible 
746+ 	exists , err  :=  file .Exists ()
747+ 	ts .NoError (err , "Exists() should not return an error" )
748+ 	ts .True (exists , "File should still exist after Touch without versioning" )
749+ }
750+ 
751+ func  (ts  * fileTestSuite ) TestNameAndPath () {
752+ 	fs  :=  NewFileSystem ()
753+ 	objectName  :=  "some/path/file.txt" 
754+ 
755+ 	file , err  :=  fs .NewFile ("bucket" , "/" + objectName )
756+ 	ts .NoError (err , "Shouldn't fail creating new file" )
757+ 
758+ 	ts .Equal ("file.txt" , file .Name (), "Name should be just the filename" )
759+ 	ts .Equal ("/some/path/file.txt" , file .Path (), "Path should be the full path" )
760+ }
761+ 
762+ func  (ts  * fileTestSuite ) TestURI () {
763+ 	fs  :=  NewFileSystem ()
764+ 	objectName  :=  "some/path/file.txt" 
765+ 
766+ 	file , err  :=  fs .NewFile ("bucket" , "/" + objectName )
767+ 	ts .NoError (err , "Shouldn't fail creating new file" )
768+ 
769+ 	ts .Equal ("gs://bucket/some/path/file.txt" , file .URI (), "URI should be correctly formatted" )
770+ 	ts .Equal ("gs://bucket/some/path/file.txt" , file .String (), "String() should return URI" )
771+ }
772+ 
542773func  TestFile (t  * testing.T ) {
543774	suite .Run (t , new (fileTestSuite ))
544775}
0 commit comments