github.com/dirtbags/moth/v4@v4.6.3-0.20240418162859-a93bc5be85d4/cmd/transpile/main_test.go (about) 1 package main 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "os" 10 "strings" 11 "testing" 12 13 "github.com/dirtbags/moth/v4/pkg/transpile" 14 "github.com/spf13/afero" 15 ) 16 17 var testMothYaml = []byte(`--- 18 answers: 19 - YAML answer 20 authors: 21 - Arthur 22 - Buster 23 - DW 24 attachments: 25 - filename: moo.txt 26 --- 27 YAML body 28 `) 29 30 func newTestFs() afero.Fs { 31 fs := afero.NewMemMapFs() 32 afero.WriteFile(fs, "cat0/1/puzzle.md", testMothYaml, 0644) 33 afero.WriteFile(fs, "cat0/1/moo.txt", []byte("Moo."), 0644) 34 afero.WriteFile(fs, "cat0/2/puzzle.moth", testMothYaml, 0644) 35 afero.WriteFile(fs, "cat0/3/puzzle.moth", testMothYaml, 0644) 36 afero.WriteFile(fs, "cat0/4/puzzle.md", testMothYaml, 0644) 37 afero.WriteFile(fs, "cat0/5/puzzle.md", testMothYaml, 0644) 38 afero.WriteFile(fs, "cat0/10/puzzle.md", testMothYaml, 0644) 39 afero.WriteFile(fs, "unbroken/1/puzzle.md", testMothYaml, 0644) 40 afero.WriteFile(fs, "unbroken/1/moo.txt", []byte("Moo."), 0644) 41 afero.WriteFile(fs, "unbroken/2/puzzle.md", testMothYaml, 0644) 42 afero.WriteFile(fs, "unbroken/2/moo.txt", []byte("Moo."), 0644) 43 return fs 44 } 45 46 func (tp T) Run(args ...string) error { 47 tp.Args = append([]string{"transpile"}, args...) 48 command, err := tp.ParseArgs() 49 if err != nil { 50 return err 51 } 52 return command() 53 } 54 55 func TestTranspilerEverything(t *testing.T) { 56 stdin := new(bytes.Buffer) 57 stdout := new(bytes.Buffer) 58 stderr := new(bytes.Buffer) 59 tp := T{ 60 Stdin: stdin, 61 Stdout: stdout, 62 Stderr: stderr, 63 BaseFs: newTestFs(), 64 } 65 66 if err := tp.Run("inventory", "-dir=cat0"); err != nil { 67 t.Error(err) 68 } 69 if stdout.String() != "{\"Puzzles\":[1,2,3,4,5,10]}" { 70 t.Errorf("Bad inventory: %#v", stdout.String()) 71 } 72 73 stdout.Reset() 74 if err := tp.Run("puzzle", "-dir=cat0/1"); err != nil { 75 t.Error(err) 76 } 77 p := transpile.Puzzle{} 78 if err := json.Unmarshal(stdout.Bytes(), &p); err != nil { 79 t.Error(err) 80 } 81 if (len(p.Answers) != 1) || (p.Answers[0] != "YAML answer") { 82 t.Error("Didn't return the right object", p) 83 } 84 85 stdout.Reset() 86 if err := tp.Run("file", "-dir=cat0/1", "moo.txt"); err != nil { 87 t.Error(err) 88 } 89 if stdout.String() != "Moo." { 90 t.Error("Wrong file pulled", stdout.String()) 91 } 92 93 stdout.Reset() 94 if err := tp.Run("answer", "-dir=cat0/1", "YAML answer"); err != nil { 95 t.Error(err) 96 } 97 if stdout.String() != `{"Correct":true}` { 98 t.Error("Answer validation failed", stdout.String()) 99 } 100 101 stdout.Reset() 102 stdin.Reset() 103 stdin.WriteString("text *emphasized* text") 104 if err := tp.Run("markdown"); err != nil { 105 t.Error(err) 106 } 107 if stdout.String() != "<p>text <em>emphasized</em> text</p>\n" { 108 t.Error("Markdown conversion failed", stdout.String()) 109 } 110 } 111 112 func TestMothballs(t *testing.T) { 113 stdout := new(bytes.Buffer) 114 stderr := new(bytes.Buffer) 115 tp := T{ 116 Stdout: stdout, 117 Stderr: stderr, 118 BaseFs: newTestFs(), 119 } 120 121 stdout.Reset() 122 if err := tp.Run("mothball", "-dir=unbroken", "unbroken.mb"); err != nil { 123 t.Error(err) 124 return 125 } 126 127 // afero.WriteFile(tp.BaseFs, "unbroken.mb", []byte("moo"), 0644) 128 fis, err := afero.ReadDir(tp.BaseFs, "/") 129 if err != nil { 130 t.Error(err) 131 } 132 for _, fi := range fis { 133 t.Log(fi.Name()) 134 } 135 136 mb, err := tp.BaseFs.Open("unbroken.mb") 137 if err != nil { 138 t.Error(err) 139 return 140 } 141 defer mb.Close() 142 143 info, err := mb.Stat() 144 if err != nil { 145 t.Error(err) 146 return 147 } 148 149 zmb, err := zip.NewReader(mb, info.Size()) 150 if err != nil { 151 t.Error(err) 152 return 153 } 154 for _, zf := range zmb.File { 155 f, err := zf.Open() 156 if err != nil { 157 t.Error(err) 158 continue 159 } 160 defer f.Close() 161 buf, err := ioutil.ReadAll(f) 162 if err != nil { 163 t.Error(err) 164 continue 165 } 166 167 switch zf.Name { 168 case "answers.txt": 169 if len(buf) == 0 { 170 t.Error("answers.txt empty") 171 } 172 case "puzzles.txt": 173 if len(buf) == 0 { 174 t.Error("puzzles.txt empty") 175 } 176 } 177 } 178 } 179 180 func TestFilesystem(t *testing.T) { 181 stdin := new(bytes.Buffer) 182 stdout := new(bytes.Buffer) 183 stderr := new(bytes.Buffer) 184 tp := T{ 185 Stdin: stdin, 186 Stdout: stdout, 187 Stderr: stderr, 188 BaseFs: afero.NewOsFs(), 189 } 190 191 stdout.Reset() 192 if err := tp.Run("puzzle", "-dir=testdata/cat1/1"); err != nil { 193 t.Error(err) 194 } 195 if !strings.Contains(stdout.String(), "moo") { 196 t.Error("File not pulled from cwd", stdout.String()) 197 } 198 199 stdout.Reset() 200 if err := tp.Run("file", "-dir=testdata/cat1/1", "moo.txt"); err != nil { 201 t.Error(err) 202 } 203 if !strings.Contains(stdout.String(), "Moo.") { 204 t.Error("Wrong file pulled", stdout.String()) 205 } 206 } 207 208 func TestCwd(t *testing.T) { 209 testwd, err := os.Getwd() 210 if err != nil { 211 t.Error("Can't get current working directory!") 212 return 213 } 214 defer os.Chdir(testwd) 215 216 stdin := new(bytes.Buffer) 217 stdout := new(bytes.Buffer) 218 stderr := new(bytes.Buffer) 219 tp := T{ 220 Stdin: stdin, 221 Stdout: stdout, 222 Stderr: stderr, 223 BaseFs: afero.NewOsFs(), 224 } 225 226 stdout.Reset() 227 os.Chdir("/") 228 if err := tp.Run( 229 "file", 230 fmt.Sprintf("-dir=%s/testdata/cat1/1", testwd), 231 "moo.txt", 232 ); err != nil { 233 t.Error(err) 234 } 235 }