tdl/test/download_test.go
2023-08-23 19:23:36 +08:00

101 lines
2.3 KiB
Go

package test
import (
"crypto/md5"
"fmt"
"io/fs"
"log"
"os"
"path/filepath"
"strconv"
"sync"
"github.com/tidwall/gjson"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
var _ = Describe("Test tdl download", FlakeAttempts(3), func() {
var (
once sync.Once
fileHash = make(map[string][16]byte)
id int64
remoteFiles = make([]int64, 0)
)
BeforeEach(func() {
once.Do(func() {
By("collect local file hashes")
Expect(filepath.WalkDir("testdata", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
bytes, err := os.ReadFile(path)
Expect(err, Succeed())
h := md5.Sum(bytes)
fileHash[filepath.Base(path)] = h
log.Println("path:", path, "md5:", h)
return nil
})).To(Succeed())
By("upload files")
exec(cmd, []string{"upload", "-p", "testdata"}, true)
By("export uploaded files")
exportFile := filepath.Join(GinkgoT().TempDir(), "export.json")
exec(cmd, []string{"chat", "export", "-T", "last", "-i", strconv.Itoa(len(fileHash)), "-o", exportFile}, true)
exportBytes, err := os.ReadFile(exportFile)
Expect(err).To(Succeed())
By("get chat id and remote file ids")
id = gjson.GetBytes(exportBytes, "id").Int()
Expect(id).NotTo(BeZero())
gjson.GetBytes(exportBytes, "messages").ForEach(func(key, value gjson.Result) bool {
remoteFiles = append(remoteFiles, value.Get("id").Int())
return true
})
Expect(len(remoteFiles)).To(Equal(len(fileHash)))
})
})
When("use url flag", func() {
It("should success", func() {
urls := make([]string, 0)
for _, u := range remoteFiles {
urls = append(urls, "-u", fmt.Sprintf("https://t.me/%d/%d", id, u))
}
dir := GinkgoT().TempDir()
args := []string{"download", "-d", dir, "--template", "{{ .FileName }}"}
args = append(args, urls...)
exec(cmd, args, true)
log.Println("check local files")
Expect(filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
bytes, err := os.ReadFile(path)
Expect(err, Succeed())
h := md5.Sum(bytes)
log.Println("path:", path, "md5:", h)
Expect(h).To(Equal(fileHash[filepath.Base(path)]))
return nil
})).To(Succeed())
})
})
})