| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- require 'test_helper'
- require 'docs'
- class DocsFileStoreTest < MiniTest::Spec
- let :store do
- Docs::FileStore.new(tmp_path)
- end
- after do
- FileUtils.rm_rf "#{tmp_path}/."
- end
- def expand_path(path)
- File.join(tmp_path, path)
- end
- def read(path)
- File.read expand_path(path)
- end
- def write(path, content)
- File.write expand_path(path), content
- end
- def exists?(path)
- File.exist? expand_path(path)
- end
- def touch(path)
- FileUtils.touch expand_path(path)
- end
- def mkpath(path)
- FileUtils.mkpath expand_path(path)
- end
- describe "#read" do
- it "reads a file" do
- write 'file', 'content'
- assert_equal 'content', store.read('file')
- end
- end
- describe "#write" do
- context "with a string" do
- it "creates the file when it doesn't exist" do
- store.write 'file', 'content'
- assert exists?('file')
- assert_equal 'content', read('file')
- end
- it "updates the file when it exists" do
- touch 'file'
- store.write 'file', 'content'
- assert_equal 'content', read('file')
- end
- end
- context "with a Tempfile" do
- let :file do
- Tempfile.new('tmp').tap do |file|
- file.write 'content'
- file.close
- end
- end
- it "creates the file when it doesn't exist" do
- store.write 'file', file
- assert exists?('file')
- assert_equal 'content', read('file')
- end
- it "updates the file when it exists" do
- touch 'file'
- store.write 'file', file
- assert_equal 'content', read('file')
- end
- end
- it "recursively creates directories" do
- store.write '1/2/file', ''
- assert exists?('1/2/file')
- end
- end
- describe "#delete" do
- it "deletes a file" do
- touch 'file'
- store.delete 'file'
- refute exists?('file')
- end
- it "deletes a directory" do
- mkpath '1/2'
- touch '1/2/file'
- store.delete '1'
- refute exists?('1/2/exist')
- refute exists?('1/2')
- refute exists?('1')
- end
- end
- describe "#exist?" do
- it "returns true when the file exists" do
- touch 'file'
- assert store.exist?('file')
- end
- it "returns false when the file doesn't exist" do
- refute store.exist?('file')
- end
- end
- describe "#mtime" do
- it "returns the file modification time" do
- touch 'file'
- created_at = Time.now.round - 86400
- modified_at = created_at + 1
- File.utime created_at, modified_at, expand_path('file')
- assert_equal modified_at, store.mtime('file')
- end
- end
- describe "#size" do
- it "returns the file's size" do
- write 'file', 'content'
- assert_equal File.size(expand_path('file')), store.size('file')
- end
- end
- describe "#each" do
- let :paths do
- paths = []
- store.each { |path| paths << path.remove(tmp_path) }
- paths
- end
- it "yields file paths" do
- touch 'file'
- assert_equal ['/file'], paths
- end
- it "yields directory paths" do
- mkpath 'dir'
- assert_equal ['/dir'], paths
- end
- it "yields file paths recursively" do
- mkpath 'dir'
- touch 'dir/file'
- assert_includes paths, '/dir/file'
- end
- it "yields directory paths recursively" do
- mkpath 'dir/dir'
- assert_includes paths, '/dir/dir'
- end
- it "doesn't yield file paths that start with '.'" do
- touch '.file'
- assert_empty paths
- end
- it "doesn't yield directory paths that start with '.'" do
- mkpath '.dir'
- assert_empty paths
- end
- it "yields directories before what's inside them" do
- mkpath 'dir'
- touch 'dir/file'
- assert paths.index('/dir') < paths.index('/dir/file')
- end
- context "when the block deletes the directory" do
- it "stops yielding what was inside it" do
- mkpath 'dir'
- touch 'dir/file'
- store.each do |path|
- (@paths ||= []) << path
- FileUtils.rm_rf(path) if path == expand_path('dir')
- end
- refute_includes @paths, expand_path('dir/file')
- end
- end
- end
- end
|