cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

main
012 / internal / ui / transfer / transfer_test.go
transfer_test.go 2.8K
1package transfer23import (4 "os"5 "path/filepath"6 "strings"7 "testing"89 tea "charm.land/bubbletea/v2"10 "github.com/charmbracelet/x/ansi"1112 "src.rest/cat/012/internal/fileio"13 "src.rest/cat/012/internal/telemetry"14 "src.rest/cat/012/internal/ui/theme"15)1617func TestProgressDisplay(t *testing.T) {18 th := theme.New(true)19 var x Transfer20 prog := fileio.NewProgress()21 cancelled := false22 x.Begin("data/big.csv", prog, func() { cancelled = true }, Book)23 prog.Report(1234, 0, 0)24 if !x.Busy() || ansi.Strip(x.Line(&th)) != "Importing big.csv… Esc cancel" {25 t.Errorf("line %q", ansi.Strip(x.Line(&th)))26 }27 left, right := x.Status(&th, 80)28 if ansi.Strip(left) != "Importing big.csv" || right != "1,234 rows read" {29 t.Errorf("status %q %q", left, right)30 }31 if pb := x.ProgressBar(); pb == nil || pb.State != tea.ProgressBarIndeterminate {32 t.Errorf("progress %+v", pb)33 }34 prog.Report(4096, 1, 2)35 if _, right := x.Status(&th, 80); !strings.HasPrefix(ansi.Strip(right), "4,096 rows read ━") || !strings.HasSuffix(right, " 50%") {36 t.Errorf("status %q", ansi.Strip(right))37 }38 if pb := x.ProgressBar(); pb == nil || pb.Value != 50 {39 t.Errorf("progress %+v", pb)40 }41 if name := x.Cancel(); name != "data/big.csv" || !cancelled || x.Busy() || x.ProgressBar() != nil {42 t.Errorf("cancel: %q cancelled %v", name, cancelled)43 }44}4546func TestUpdateDropsStaleResults(t *testing.T) {47 var x Transfer48 old := x.Begin("old.csv", fileio.NewProgress(), func() {}, Book)49 id := x.Begin("new.csv", fileio.NewProgress(), func() {}, Sheet)50 if _, done, cmd := x.Update(TickMsg{old}); done || cmd != nil {51 t.Error("a stale tick ticked")52 }53 if _, _, cmd := x.Update(TickMsg{id}); cmd == nil {54 t.Error("the running import stopped ticking")55 }56 if _, done, _ := x.Update(ImportedMsg{ID: old}); done {57 t.Error("a stale result was taken")58 }59 res, done, _ := x.Update(ImportedMsg{ID: id, Name: "new.csv", Place: Sheet})60 if !done || res.Name != "new.csv" || res.Place != Sheet || x.Busy() {61 t.Errorf("result %+v done %v busy %v", res, done, x.Busy())62 }63}6465func TestStartReadsInTheBackground(t *testing.T) {66 path := filepath.Join(t.TempDir(), "a.csv")67 if err := os.WriteFile(path, []byte("1,2\n3,4\n"), 0o600); err != nil {68 t.Fatal(err)69 }70 var x Transfer71 cmd := x.Start("a.csv", path, fileio.Options{}, NewSheets, telemetry.Parent{})72 var res ImportedMsg73 for _, c := range cmd().(tea.BatchMsg) {74 if msg, ok := c().(ImportedMsg); ok {75 res = msg76 }77 }78 got, done, _ := x.Update(res)79 if !done || got.Err != nil || got.Res.Rows != 2 || got.Place != NewSheets {80 t.Errorf("imported %+v, err %v", got.Res, got.Err)81 }82}8384func TestRows(t *testing.T) {85 for n, want := range map[int]string{1: "1 row", 2: "2 rows", 1234567: "1,234,567 rows"} {86 if got := Rows(n); got != want {87 t.Errorf("Rows(%d) = %q", n, got)88 }89 }90}