package main_test import ( "context" "io/ioutil" "os" "path" "slices" "testing" main "gitea/show-ingestion" ) func TestRun(t *testing.T) { cases := map[string]struct { given []string patterns []string overrides map[string]string want []string }{ "empty": {}, "fallback survivor": { given: []string{ "Survivor.AU.S12E11.1080p.HEVC.x265-MeGusta[EZTVx.to].mkv", "Survivor.AU.S12E11.720p.HEVC.x265-MeGusta[EZTVx.to].mkv", "Survivor.AU.S12E12.720p.HEVC.x265-MeGusta[EZTVx.to].mkv", }, patterns: []string{ ".urvivor.[Aa][Uu].*[sS](?P[0-9]+)[eE](?P[0-9]*).*1080.*MeGusta", ".urvivor.[Aa][Uu].*[sS](?P[0-9]+)[eE](?P[0-9]*).*720.*MeGusta", }, overrides: map[string]string{ "title": "Australian_Survivor", }, want: []string{ "Australian_Survivor_S12E11.mkv", "Australian_Survivor_S12E12.mkv", }, }, "easy w group": { given: []string{ "[SubsPlease] Tokidoki Bosotto Russia-go de Dereru Tonari no Alya-san - 01 (720p) [A12844D5].mkv", "[SubsPlease] Tokidoki Bosotto Russia-go de Dereru Tonari no Alya-san - 02 (720p) [2608F490].mkv", }, patterns: []string{ `^\[[^\]]*\] (?P.*) - (?<episode>[0-9]*)`, }, overrides: map[string]string{ "season": "01", }, want: []string{ "Tokidoki_Bosotto_Russia-go_de_Dereru_Tonari_no_Alya-san_S01E01.mkv", "Tokidoki_Bosotto_Russia-go_de_Dereru_Tonari_no_Alya-san_S01E02.mkv", }, }, } for name, d := range cases { c := d t.Run(name, func(t *testing.T) { ind := t.TempDir() for _, f := range c.given { ioutil.WriteFile(path.Join(ind, f), []byte{}, os.ModePerm) } outd := t.TempDir() if err := main.Run(context.Background(), outd, ind, c.patterns, c.overrides); err != nil { t.Fatal(err) } for _, f := range c.want { if stat, err := os.Stat(path.Join(outd, f)); os.IsNotExist(err) { t.Errorf("expected %s", f) } else if !stat.Mode().IsRegular() { t.Errorf("%s not a regular file: %v", f, stat.Mode()) } } if entries, err := os.ReadDir(outd); err != nil { t.Error("failed to list outdir: %w", err) } else { for _, entry := range entries { t.Logf("%s", entry.Name()) if !slices.Contains(c.want, path.Base(entry.Name())) { t.Errorf("unexpected %s", entry.Name()) } if stat, err := entry.Info(); err != nil { t.Errorf("cant read info of %s: %v", entry.Name(), err) } else if !stat.Mode().IsRegular() { t.Errorf("non-regular file %s in out: %v", entry.Name(), stat.Mode()) } } } if entries, err := os.ReadDir(outd); err != nil { t.Error("failed to list outdir: %w", err) } else { for _, entry := range entries { if !slices.Contains(c.want, path.Base(entry.Name())) { t.Errorf("unexpected %s", entry.Name()) } } } if entries, err := os.ReadDir(ind); err != nil { t.Error("failed to list indir: %w", err) } else { for _, entry := range entries { inf := path.Join(ind, entry.Name()) if _, err := os.Stat(inf); err != nil { t.Errorf("%s no longer in ind: %v", inf, err) } } } }) } }