quintodrome/scanner/change_detector_test.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

153 lines
4.4 KiB
Go
Raw Normal View History

2020-01-16 12:53:48 -09:00
package scanner
import (
2020-07-12 09:36:22 -08:00
"context"
2020-01-16 12:53:48 -09:00
"io/ioutil"
"os"
"path/filepath"
2020-01-16 12:53:48 -09:00
"time"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("changeDetector", func() {
2020-01-16 12:53:48 -09:00
var testFolder string
var scanner *changeDetector
2020-01-16 12:53:48 -09:00
lastModifiedSince := time.Time{}
2020-01-16 12:53:48 -09:00
BeforeEach(func() {
2020-01-23 15:44:08 -09:00
testFolder, _ = ioutil.TempDir("", "navidrome_tests")
2020-02-02 16:44:56 -09:00
err := os.MkdirAll(testFolder, 0777)
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
scanner = newChangeDetector(testFolder)
2020-01-16 12:53:48 -09:00
})
It("detects changes recursively", func() {
// Scan empty folder
2020-07-12 09:36:22 -08:00
changed, deleted, err := scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf("."))
// Add one subfolder
lastModifiedSince = nowWithDelay()
2020-02-02 16:44:56 -09:00
err = os.MkdirAll(filepath.Join(testFolder, "a"), 0777)
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf(".", P("a")))
2020-01-16 12:53:48 -09:00
// Add more subfolders
lastModifiedSince = nowWithDelay()
2020-02-02 16:44:56 -09:00
err = os.MkdirAll(filepath.Join(testFolder, "a", "b", "c"), 0777)
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf(P("a"), P("a/b"), P("a/b/c")))
2020-01-16 12:53:48 -09:00
// Scan with no changes
lastModifiedSince = nowWithDelay()
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(BeEmpty())
// New file in subfolder
lastModifiedSince = nowWithDelay()
_, err = os.Create(filepath.Join(testFolder, "a", "b", "empty.txt"))
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf(P("a/b")))
2020-01-16 12:53:48 -09:00
// Delete file in subfolder
lastModifiedSince = nowWithDelay()
err = os.Remove(filepath.Join(testFolder, "a", "b", "empty.txt"))
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf(P("a/b")))
2020-01-16 12:53:48 -09:00
// Delete subfolder
lastModifiedSince = nowWithDelay()
err = os.Remove(filepath.Join(testFolder, "a", "b", "c"))
2020-01-16 12:53:48 -09:00
if err != nil {
panic(err)
}
2020-07-12 09:36:22 -08:00
changed, deleted, err = scanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(ConsistOf(P("a/b/c")))
Expect(changed).To(ConsistOf(P("a/b")))
2020-01-16 12:53:48 -09:00
// Only returns changes after lastModifiedSince
lastModifiedSince = nowWithDelay()
newScanner := newChangeDetector(testFolder)
2020-07-12 09:36:22 -08:00
changed, deleted, err = newScanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(BeEmpty())
Expect(changed).To(BeEmpty())
2020-04-26 08:35:26 -08:00
f, _ := os.Create(filepath.Join(testFolder, "a", "b", "new.txt"))
_ = f.Close()
2020-07-12 09:36:22 -08:00
changed, deleted, err = newScanner.Scan(context.TODO(), lastModifiedSince)
2020-01-16 12:53:48 -09:00
Expect(err).To(BeNil())
Expect(deleted).To(BeEmpty())
Expect(changed).To(ConsistOf(P("a/b")))
2020-01-16 12:53:48 -09:00
})
2020-05-18 11:06:33 -08:00
Describe("isDirOrSymlinkToDir", func() {
It("returns true for normal dirs", func() {
dir, _ := os.Stat("tests/fixtures")
2020-05-18 11:06:33 -08:00
Expect(isDirOrSymlinkToDir("tests", dir)).To(BeTrue())
})
It("returns true for symlinks to dirs", func() {
dir, _ := os.Stat("tests/fixtures/symlink2dir")
2020-05-18 11:06:33 -08:00
Expect(isDirOrSymlinkToDir("tests/fixtures", dir)).To(BeTrue())
})
It("returns false for files", func() {
dir, _ := os.Stat("tests/fixtures/test.mp3")
2020-05-18 11:06:33 -08:00
Expect(isDirOrSymlinkToDir("tests/fixtures", dir)).To(BeFalse())
})
It("returns false for symlinks to files", func() {
dir, _ := os.Stat("tests/fixtures/symlink")
2020-05-18 11:06:33 -08:00
Expect(isDirOrSymlinkToDir("tests/fixtures", dir)).To(BeFalse())
})
})
2020-05-18 11:06:33 -08:00
Describe("isDirIgnored", func() {
baseDir := filepath.Join("tests", "fixtures")
It("returns false for normal dirs", func() {
dir, _ := os.Stat(filepath.Join(baseDir, "empty_folder"))
2020-05-18 11:06:33 -08:00
Expect(isDirIgnored(baseDir, dir)).To(BeFalse())
})
It("returns true when folder contains .ndignore file", func() {
dir, _ := os.Stat(filepath.Join(baseDir, "ignored_folder"))
2020-05-18 11:06:33 -08:00
Expect(isDirIgnored(baseDir, dir)).To(BeTrue())
})
})
2020-01-16 12:53:48 -09:00
})
// I hate time-based tests....
func nowWithDelay() time.Time {
now := time.Now()
time.Sleep(50 * time.Millisecond)
return now
}