github.com/goravel/framework@v1.13.9/filesystem/local_test.go (about)

     1  package filesystem
     2  
     3  import (
     4  	"context"
     5  	"mime"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/suite"
    12  
    13  	configmock "github.com/goravel/framework/contracts/config/mocks"
    14  	"github.com/goravel/framework/support/carbon"
    15  	"github.com/goravel/framework/support/env"
    16  	"github.com/goravel/framework/support/file"
    17  )
    18  
    19  type LocalTestSuite struct {
    20  	suite.Suite
    21  	local      *Local
    22  	file       *File
    23  	mockConfig *configmock.Config
    24  }
    25  
    26  func TestLocalTestSuite(t *testing.T) {
    27  	suite.Run(t, new(LocalTestSuite))
    28  
    29  	assert.Nil(t, file.Remove("test.txt"))
    30  }
    31  
    32  func (s *LocalTestSuite) SetupTest() {
    33  	s.mockConfig = &configmock.Config{}
    34  
    35  	dir, err := os.MkdirTemp("", "local-test")
    36  	s.Nil(err)
    37  
    38  	err = os.WriteFile(dir+"/test.txt", []byte("goravel"), 0644)
    39  	s.Nil(err)
    40  
    41  	err = os.Mkdir(dir+"/test", 0755)
    42  	s.Nil(err)
    43  
    44  	s.mockConfig.On("GetString", "filesystems.default").Return("local").Once()
    45  	s.mockConfig.On("GetString", "filesystems.disks.local.root").Return(dir).Once()
    46  	s.mockConfig.On("GetString", "filesystems.disks.local.url").Return("https://goravel.dev").Once()
    47  	ConfigFacade = s.mockConfig
    48  
    49  	s.local, err = NewLocal(s.mockConfig, "local")
    50  	s.Nil(err)
    51  	s.NotNil(s.local)
    52  
    53  	s.file, err = NewFile("./file.go")
    54  	s.Nil(err)
    55  	s.NotNil(s.file)
    56  
    57  	s.mockConfig.AssertExpectations(s.T())
    58  }
    59  
    60  func (s *LocalTestSuite) TestAllDirectories() {
    61  	s.Nil(s.local.Put("AllDirectories/1.txt", "Goravel"))
    62  	s.Nil(s.local.Put("AllDirectories/2.txt", "Goravel"))
    63  	s.Nil(s.local.Put("AllDirectories/3/3.txt", "Goravel"))
    64  	s.Nil(s.local.Put("AllDirectories/3/5/6/6.txt", "Goravel"))
    65  	s.Nil(s.local.MakeDirectory("AllDirectories/3/4"))
    66  	s.True(s.local.Exists("AllDirectories/1.txt"))
    67  	s.True(s.local.Exists("AllDirectories/2.txt"))
    68  	s.True(s.local.Exists("AllDirectories/3/3.txt"))
    69  	s.True(s.local.Exists("AllDirectories/3/4/"))
    70  	s.True(s.local.Exists("AllDirectories/3/5/6/6.txt"))
    71  	files, err := s.local.AllDirectories("AllDirectories")
    72  	s.Nil(err)
    73  	if env.IsWindows() {
    74  		s.Equal([]string{"3\\", "3\\4\\", "3\\5\\", "3\\5\\6\\"}, files)
    75  	} else {
    76  		s.Equal([]string{"3/", "3/4/", "3/5/", "3/5/6/"}, files)
    77  	}
    78  	files, err = s.local.AllDirectories("./AllDirectories")
    79  	s.Nil(err)
    80  	if env.IsWindows() {
    81  		s.Equal([]string{"3\\", "3\\4\\", "3\\5\\", "3\\5\\6\\"}, files)
    82  	} else {
    83  		s.Equal([]string{"3/", "3/4/", "3/5/", "3/5/6/"}, files)
    84  	}
    85  	files, err = s.local.AllDirectories("/AllDirectories")
    86  	s.Nil(err)
    87  	if env.IsWindows() {
    88  		s.Equal([]string{"3\\", "3\\4\\", "3\\5\\", "3\\5\\6\\"}, files)
    89  	} else {
    90  		s.Equal([]string{"3/", "3/4/", "3/5/", "3/5/6/"}, files)
    91  	}
    92  	files, err = s.local.AllDirectories("./AllDirectories/")
    93  	s.Nil(err)
    94  	if env.IsWindows() {
    95  		s.Equal([]string{"3\\", "3\\4\\", "3\\5\\", "3\\5\\6\\"}, files)
    96  	} else {
    97  		s.Equal([]string{"3/", "3/4/", "3/5/", "3/5/6/"}, files)
    98  	}
    99  	s.Nil(s.local.DeleteDirectory("AllDirectories"))
   100  }
   101  
   102  func (s *LocalTestSuite) TestAllFiles() {
   103  	s.Nil(s.local.Put("AllFiles/1.txt", "Goravel"))
   104  	s.Nil(s.local.Put("AllFiles/2.txt", "Goravel"))
   105  	s.Nil(s.local.Put("AllFiles/3/3.txt", "Goravel"))
   106  	s.Nil(s.local.Put("AllFiles/3/4/4.txt", "Goravel"))
   107  	s.True(s.local.Exists("AllFiles/1.txt"))
   108  	s.True(s.local.Exists("AllFiles/2.txt"))
   109  	s.True(s.local.Exists("AllFiles/3/3.txt"))
   110  	s.True(s.local.Exists("AllFiles/3/4/4.txt"))
   111  	files, err := s.local.AllFiles("AllFiles")
   112  	s.Nil(err)
   113  	if env.IsWindows() {
   114  		s.Equal([]string{"1.txt", "2.txt", "3\\3.txt", "3\\4\\4.txt"}, files)
   115  	} else {
   116  		s.Equal([]string{"1.txt", "2.txt", "3/3.txt", "3/4/4.txt"}, files)
   117  	}
   118  	files, err = s.local.AllFiles("./AllFiles")
   119  	s.Nil(err)
   120  	if env.IsWindows() {
   121  		s.Equal([]string{"1.txt", "2.txt", "3\\3.txt", "3\\4\\4.txt"}, files)
   122  	} else {
   123  		s.Equal([]string{"1.txt", "2.txt", "3/3.txt", "3/4/4.txt"}, files)
   124  	}
   125  	files, err = s.local.AllFiles("/AllFiles")
   126  	s.Nil(err)
   127  	if env.IsWindows() {
   128  		s.Equal([]string{"1.txt", "2.txt", "3\\3.txt", "3\\4\\4.txt"}, files)
   129  	} else {
   130  		s.Equal([]string{"1.txt", "2.txt", "3/3.txt", "3/4/4.txt"}, files)
   131  	}
   132  	files, err = s.local.AllFiles("./AllFiles/")
   133  	s.Nil(err)
   134  	if env.IsWindows() {
   135  		s.Equal([]string{"1.txt", "2.txt", "3\\3.txt", "3\\4\\4.txt"}, files)
   136  	} else {
   137  		s.Equal([]string{"1.txt", "2.txt", "3/3.txt", "3/4/4.txt"}, files)
   138  	}
   139  	s.Nil(s.local.DeleteDirectory("AllFiles"))
   140  }
   141  
   142  func (s *LocalTestSuite) TestCopy() {
   143  	s.Nil(s.local.Put("Copy/1.txt", "Goravel"))
   144  	s.True(s.local.Exists("Copy/1.txt"))
   145  	s.Nil(s.local.Copy("Copy/1.txt", "Copy1/1.txt"))
   146  	s.True(s.local.Exists("Copy/1.txt"))
   147  	s.True(s.local.Exists("Copy1/1.txt"))
   148  	s.Nil(s.local.DeleteDirectory("Copy"))
   149  	s.Nil(s.local.DeleteDirectory("Copy1"))
   150  }
   151  
   152  func (s *LocalTestSuite) TestDelete() {
   153  	s.Nil(s.local.Put("Delete/1.txt", "Goravel"))
   154  	s.True(s.local.Exists("Delete/1.txt"))
   155  	s.Nil(s.local.Delete("Delete/1.txt"))
   156  	s.True(s.local.Missing("Delete/1.txt"))
   157  	s.Nil(s.local.DeleteDirectory("Delete"))
   158  }
   159  
   160  func (s *LocalTestSuite) TestDeleteDirectory() {
   161  	s.Nil(s.local.Put("DeleteDirectory/1.txt", "Goravel"))
   162  	s.True(s.local.Exists("DeleteDirectory/1.txt"))
   163  	s.Nil(s.local.DeleteDirectory("DeleteDirectory"))
   164  	s.True(s.local.Missing("DeleteDirectory/1.txt"))
   165  	s.Nil(s.local.DeleteDirectory("DeleteDirectory"))
   166  }
   167  
   168  func (s *LocalTestSuite) TestDirectories() {
   169  	s.Nil(s.local.Put("Directories/1.txt", "Goravel"))
   170  	s.Nil(s.local.Put("Directories/2.txt", "Goravel"))
   171  	s.Nil(s.local.Put("Directories/3/3.txt", "Goravel"))
   172  	s.Nil(s.local.Put("Directories/3/5/5.txt", "Goravel"))
   173  	s.Nil(s.local.MakeDirectory("Directories/3/4"))
   174  	s.True(s.local.Exists("Directories/1.txt"))
   175  	s.True(s.local.Exists("Directories/2.txt"))
   176  	s.True(s.local.Exists("Directories/3/3.txt"))
   177  	s.True(s.local.Exists("Directories/3/4/"))
   178  	s.True(s.local.Exists("Directories/3/5/5.txt"))
   179  	files, err := s.local.Directories("Directories")
   180  	s.Nil(err)
   181  	if env.IsWindows() {
   182  		s.Equal([]string{"3\\"}, files)
   183  	} else {
   184  		s.Equal([]string{"3/"}, files)
   185  	}
   186  	files, err = s.local.Directories("./Directories")
   187  	s.Nil(err)
   188  	if env.IsWindows() {
   189  		s.Equal([]string{"3\\"}, files)
   190  	} else {
   191  		s.Equal([]string{"3/"}, files)
   192  	}
   193  	files, err = s.local.Directories("/Directories")
   194  	s.Nil(err)
   195  	if env.IsWindows() {
   196  		s.Equal([]string{"3\\"}, files)
   197  	} else {
   198  		s.Equal([]string{"3/"}, files)
   199  	}
   200  	files, err = s.local.Directories("./Directories/")
   201  	s.Nil(err)
   202  	if env.IsWindows() {
   203  		s.Equal([]string{"3\\"}, files)
   204  	} else {
   205  		s.Equal([]string{"3/"}, files)
   206  	}
   207  	s.Nil(s.local.DeleteDirectory("Directories"))
   208  }
   209  
   210  func (s *LocalTestSuite) TestExists() {
   211  	exists := s.local.Exists("test.txt")
   212  	s.True(exists)
   213  
   214  	exists = s.local.Exists("test1.txt")
   215  	s.False(exists)
   216  }
   217  
   218  func (s *LocalTestSuite) TestFiles() {
   219  	s.Nil(s.local.Put("Files/1.txt", "Goravel"))
   220  	s.Nil(s.local.Put("Files/2.txt", "Goravel"))
   221  	s.Nil(s.local.Put("Files/3/3.txt", "Goravel"))
   222  	s.Nil(s.local.Put("Files/3/4/4.txt", "Goravel"))
   223  	s.True(s.local.Exists("Files/1.txt"))
   224  	s.True(s.local.Exists("Files/2.txt"))
   225  	s.True(s.local.Exists("Files/3/3.txt"))
   226  	s.True(s.local.Exists("Files/3/4/4.txt"))
   227  	files, err := s.local.Files("Files")
   228  	s.Nil(err)
   229  	s.Equal([]string{"1.txt", "2.txt"}, files)
   230  	files, err = s.local.Files("./Files")
   231  	s.Nil(err)
   232  	s.Equal([]string{"1.txt", "2.txt"}, files)
   233  	files, err = s.local.Files("/Files")
   234  	s.Nil(err)
   235  	s.Equal([]string{"1.txt", "2.txt"}, files)
   236  	files, err = s.local.Files("./Files/")
   237  	s.Nil(err)
   238  	s.Equal([]string{"1.txt", "2.txt"}, files)
   239  	s.Nil(s.local.DeleteDirectory("Files"))
   240  }
   241  
   242  func (s *LocalTestSuite) TestGet() {
   243  	s.Nil(s.local.Put("Get/1.txt", "Goravel"))
   244  	s.True(s.local.Exists("Get/1.txt"))
   245  	data, err := s.local.Get("Get/1.txt")
   246  	s.Nil(err)
   247  	s.Equal("Goravel", data)
   248  	length, err := s.local.Size("Get/1.txt")
   249  	s.Nil(err)
   250  	s.Equal(int64(7), length)
   251  	s.Nil(s.local.DeleteDirectory("Get"))
   252  }
   253  
   254  func (s *LocalTestSuite) TestGetBytes() {
   255  	s.Nil(s.local.Put("Get/1.txt", "Goravel"))
   256  	s.True(s.local.Exists("Get/1.txt"))
   257  	data, err := s.local.GetBytes("Get/1.txt")
   258  	s.Nil(err)
   259  	s.Equal([]byte("Goravel"), data)
   260  	length, err := s.local.Size("Get/1.txt")
   261  	s.Nil(err)
   262  	s.Equal(int64(7), length)
   263  	s.Nil(s.local.DeleteDirectory("Get"))
   264  }
   265  
   266  func (s *LocalTestSuite) TestLastModified() {
   267  	s.mockConfig.On("GetString", "app.timezone").Return("UTC").Once()
   268  
   269  	s.Nil(s.local.Put("LastModified/1.txt", "Goravel"))
   270  	s.True(s.local.Exists("LastModified/1.txt"))
   271  	date, err := s.local.LastModified("LastModified/1.txt")
   272  	s.Nil(err)
   273  
   274  	s.Nil(err)
   275  	s.Equal(carbon.Now().ToDateString(), carbon.FromStdTime(date).ToDateString())
   276  	s.Nil(s.local.DeleteDirectory("LastModified"))
   277  }
   278  
   279  func (s *LocalTestSuite) TestMakeDirectory() {
   280  	s.Nil(s.local.MakeDirectory("MakeDirectory1/"))
   281  	s.Nil(s.local.MakeDirectory("MakeDirectory2"))
   282  	s.Nil(s.local.MakeDirectory("MakeDirectory3/MakeDirectory4"))
   283  	s.Nil(s.local.DeleteDirectory("MakeDirectory1"))
   284  	s.Nil(s.local.DeleteDirectory("MakeDirectory2"))
   285  	s.Nil(s.local.DeleteDirectory("MakeDirectory3"))
   286  	s.Nil(s.local.DeleteDirectory("MakeDirectory4"))
   287  }
   288  
   289  func (s *LocalTestSuite) TestMimeType_File() {
   290  	s.Nil(s.local.Put("MimeType/1.txt", "Goravel"))
   291  	s.True(s.local.Exists("MimeType/1.txt"))
   292  	mimeType, err := s.local.MimeType("MimeType/1.txt")
   293  	s.Nil(err)
   294  	mediaType, _, err := mime.ParseMediaType(mimeType)
   295  	s.Nil(err)
   296  	s.Equal("text/plain", mediaType)
   297  }
   298  
   299  func (s *LocalTestSuite) TestMimeType_Image() {
   300  	s.mockConfig.On("GetString", "filesystems.default").Return("local").Once()
   301  
   302  	fileInfo, err := NewFile("../logo.png")
   303  	s.Nil(err)
   304  	path, err := s.local.PutFile("MimeType", fileInfo)
   305  	s.Nil(err)
   306  	s.True(s.local.Exists(path))
   307  	mimeType, err := s.local.MimeType(path)
   308  	s.Nil(err)
   309  	s.Equal("image/png", mimeType)
   310  }
   311  
   312  func (s *LocalTestSuite) TestMissing() {
   313  	missing := s.local.Missing("test.txt")
   314  	s.False(missing)
   315  
   316  	missing = s.local.Missing("test1.txt")
   317  	s.True(missing)
   318  }
   319  
   320  func (s *LocalTestSuite) TestMove() {
   321  	s.Nil(s.local.Put("Move/1.txt", "Goravel"))
   322  	s.True(s.local.Exists("Move/1.txt"))
   323  	s.Nil(s.local.Move("Move/1.txt", "Move1/1.txt"))
   324  	s.True(s.local.Missing("Move/1.txt"))
   325  	s.True(s.local.Exists("Move1/1.txt"))
   326  	s.Nil(s.local.DeleteDirectory("Move"))
   327  	s.Nil(s.local.DeleteDirectory("Move1"))
   328  }
   329  
   330  func (s *LocalTestSuite) TestPath() {
   331  	path := s.local.Path("test.txt")
   332  	s.Equal(filepath.Join(s.local.root, "test.txt"), path)
   333  }
   334  
   335  func (s *LocalTestSuite) TestPut() {
   336  	s.Nil(s.local.Put("Put/1.txt", "Goravel"))
   337  	s.True(s.local.Exists("Put/1.txt"))
   338  	s.True(s.local.Missing("Put/2.txt"))
   339  	s.Nil(s.local.DeleteDirectory("Put"))
   340  }
   341  
   342  func (s *LocalTestSuite) TestPutFile_Text() {
   343  	path, err := s.local.PutFile("PutFile", s.file)
   344  	s.Nil(err)
   345  	s.True(s.local.Exists(path))
   346  	data, err := s.local.Get(path)
   347  	s.Nil(err)
   348  	s.NotEmpty(data)
   349  	s.Nil(s.local.DeleteDirectory("PutFile"))
   350  }
   351  
   352  func (s *LocalTestSuite) TestPutFile_Image() {
   353  	s.mockConfig.On("GetString", "filesystems.default").Return("local").Once()
   354  
   355  	fileInfo, err := NewFile("../logo.png")
   356  	s.Nil(err)
   357  	path, err := s.local.PutFile("PutFile1", fileInfo)
   358  	s.Nil(err)
   359  	s.True(s.local.Exists(path))
   360  	s.Nil(s.local.DeleteDirectory("PutFile1"))
   361  }
   362  
   363  func (s *LocalTestSuite) TestPutFileAs_Text() {
   364  	path, err := s.local.PutFileAs("PutFileAs", s.file, "text")
   365  	s.Nil(err)
   366  	s.Equal(filepath.Join("PutFileAs", "text.txt"), path)
   367  	s.True(s.local.Exists(path))
   368  	data, err := s.local.Get(path)
   369  	s.Nil(err)
   370  	s.NotEmpty(data)
   371  
   372  	path, err = s.local.PutFileAs("PutFileAs", s.file, "text1.txt")
   373  	s.Nil(err)
   374  	s.Equal(filepath.Join("PutFileAs", "text1.txt"), path)
   375  	s.True(s.local.Exists(path))
   376  	data, err = s.local.Get(path)
   377  	s.Nil(err)
   378  	s.NotEmpty(data)
   379  
   380  	s.Nil(s.local.DeleteDirectory("PutFileAs"))
   381  }
   382  
   383  func (s *LocalTestSuite) TestPutFileAs_Image() {
   384  	s.mockConfig.On("GetString", "filesystems.default").Return("local").Once()
   385  
   386  	fileInfo, err := NewFile("../logo.png")
   387  	s.Nil(err)
   388  	path, err := s.local.PutFileAs("PutFileAs1", fileInfo, "image")
   389  	s.Nil(err)
   390  	s.Equal(filepath.Join("PutFileAs1", "image.png"), path)
   391  	s.True(s.local.Exists(path))
   392  
   393  	path, err = s.local.PutFileAs("PutFileAs1", fileInfo, "image1.png")
   394  	s.Nil(err)
   395  	s.Equal(filepath.Join("PutFileAs1", "image1.png"), path)
   396  	s.True(s.local.Exists(path))
   397  
   398  	s.Nil(s.local.DeleteDirectory("PutFileAs1"))
   399  }
   400  
   401  func (s *LocalTestSuite) TestSize() {
   402  	s.Nil(s.local.Put("Size/1.txt", "Goravel"))
   403  	s.True(s.local.Exists("Size/1.txt"))
   404  	length, err := s.local.Size("Size/1.txt")
   405  	s.Nil(err)
   406  	s.Equal(int64(7), length)
   407  	s.Nil(s.local.DeleteDirectory("Size"))
   408  }
   409  
   410  func (s *LocalTestSuite) TestTemporaryUrl() {
   411  	s.Nil(s.local.Put("TemporaryUrl/1.txt", "Goravel"))
   412  	s.True(s.local.Exists("TemporaryUrl/1.txt"))
   413  	url, err := s.local.TemporaryUrl("TemporaryUrl/1.txt", carbon.Now().AddSeconds(5).ToStdTime())
   414  	s.Nil(err)
   415  	s.NotEmpty(url)
   416  	s.Nil(s.local.DeleteDirectory("TemporaryUrl"))
   417  }
   418  
   419  func (s *LocalTestSuite) TestWithContext() {
   420  	driver := s.local.WithContext(context.Background())
   421  	s.Equal(s.local, driver)
   422  }
   423  
   424  func (s *LocalTestSuite) TestUrl() {
   425  	s.Equal("https://goravel.dev/Url/1.txt", s.local.Url("Url/1.txt"))
   426  
   427  	if env.IsWindows() {
   428  		s.Equal("https://goravel.dev/Url/2.txt", s.local.Url(`Url\2.txt`))
   429  	}
   430  }