tdl/test/upload_test.go
2023-08-21 13:19:40 +08:00

138 lines
3.2 KiB
Go

package test
import (
"log"
"math/rand"
"os"
"path/filepath"
"strconv"
"github.com/google/uuid"
"github.com/tidwall/gjson"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("Test tdl upload", FlakeAttempts(3), func() {
BeforeEach(func() {
args = []string{"upload"}
})
var (
dir string
files []string
)
BeforeEach(func() {
dir = GinkgoT().TempDir()
// create files
files = make([]string, 0)
for i := 0; i < rand.Intn(3)+3; i++ {
file := filepath.Join(dir, uuid.New().String())
// generate random file with size between 1MB and 2MB
f, err := os.Create(file)
Expect(err).To(Succeed())
Expect(f.Truncate(int64(rand.Intn(1e5)) + 1e5)).To(Succeed())
Expect(f.Close()).To(Succeed())
files = append(files, file)
}
})
checkFiles := func(chat string, n int, expected []string) {
By("check if files are uploaded")
exportFile := filepath.Join(dir, "export.json")
exec(cmd, []string{"chat", "-c", chat, "export", "-T", "last", "-i", strconv.Itoa(n), "-o", exportFile}, true)
exportBytes, err := os.ReadFile(exportFile)
Expect(err).To(Succeed())
actualFiles := make([]string, 0)
gjson.GetBytes(exportBytes, "messages").ForEach(func(key, value gjson.Result) bool {
actualFiles = append(actualFiles, filepath.Join(dir, value.Get("file").String()))
return true
})
log.Printf("actual files on server: %v", actualFiles)
Expect(actualFiles).To(ConsistOf(expected))
}
When("use path flag", func() {
It("should success", func() {
args = append(args, "-p", dir)
exec(cmd, args, true)
checkFiles("", len(files), files)
})
It("should fail with invalid path", func() {
args = append(args, "-p", "foo")
exec(cmd, args, false)
})
It("should fail with invalid file", func() {
args = append(args, "-p", "foo.bar")
exec(cmd, args, false)
})
})
When("use rm flag", func() {
It("should success", func() {
args = append(args, "-p", dir, "--rm")
exec(cmd, args, true)
checkFiles("", len(files), files)
By("check if files are removed")
for _, file := range files {
_, err := os.Stat(file)
Expect(os.IsNotExist(err)).To(BeTrue())
}
})
})
When("use chat flag", func() {
It("should success", func() {
By("get a private chat id")
exec(cmd, []string{"chat", "ls", "-o", "json", "-f", "Type contains 'private'"}, true)
chat := gjson.Get(output, "0.id").String()
Expect(chat).NotTo(BeEmpty())
args = append(args, "-p", dir, "-c", chat)
exec(cmd, args, true)
checkFiles(chat, len(files), files)
})
It("should fail with invalid chat domain", func() {
args = append(args, "-p", dir, "-c", "foo")
exec(cmd, args, false)
})
It("should fail with invalid chat id", func() {
args = append(args, "-p", dir, "-c", "-100")
exec(cmd, args, false)
})
})
When("use exclude flag", func() {
It("should success", func() {
By("modify files' extension")
modify, remain := files[:len(files)/2], files[len(files)/2:]
log.Printf("modify files: %v", modify)
log.Printf("remain files: %v", remain)
for _, file := range modify {
Expect(os.Rename(file, file+".foo")).To(Succeed())
}
args = append(args, "-p", dir, "-e", ".foo")
exec(cmd, args, true)
checkFiles("", len(remain), remain)
})
})
})