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  }