github.com/davinci-std/kanvas@v0.11.1/test/snapshot_test.go (about)

     1  package test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/davinci-std/kanvas/app"
    10  
    11  	"github.com/davinci-std/kanvas"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  type Config struct {
    18  	Env   string
    19  	Error string
    20  }
    21  
    22  type Option func(*Config)
    23  
    24  func Error(err string) Option {
    25  	return func(c *Config) {
    26  		c.Error = err
    27  	}
    28  }
    29  
    30  func Env(env string) Option {
    31  	return func(c *Config) {
    32  		c.Env = env
    33  	}
    34  }
    35  
    36  func TestExport(t *testing.T) {
    37  	if testing.Short() {
    38  		t.SkipNow()
    39  	}
    40  
    41  	run(t, "reference")
    42  	run(t, "jsonnet")
    43  	run(t, "unusedenv", Env("dev"), Error(`environment "dev" uses "missing" but it is not defined`))
    44  }
    45  
    46  func run(t *testing.T, sub string, opts ...Option) {
    47  	t.Helper()
    48  
    49  	var (
    50  		config Config
    51  	)
    52  
    53  	for _, opt := range opts {
    54  		opt(&config)
    55  	}
    56  
    57  	env := config.Env
    58  	wantErr := config.Error
    59  
    60  	var name string
    61  	if env == "" {
    62  		name = sub
    63  	} else {
    64  		name = fmt.Sprintf("%s-%s", sub, env)
    65  	}
    66  
    67  	t.Run(name, func(t *testing.T) {
    68  		var (
    69  			exportsDir = filepath.Join(name, "exports")
    70  			destDir    = t.TempDir()
    71  
    72  			exports = map[string]string{}
    73  		)
    74  
    75  		if wantErr == "" {
    76  			files, err := os.ReadDir(exportsDir)
    77  			require.NoError(t, err)
    78  
    79  			for _, f := range files {
    80  				fn := filepath.Join(exportsDir, f.Name())
    81  				data, err := os.ReadFile(fn)
    82  				require.NoError(t, err)
    83  				exports[f.Name()] = string(data)
    84  			}
    85  		}
    86  
    87  		wd, err := os.Getwd()
    88  		require.NoError(t, err)
    89  		require.NoError(t, os.Chdir(sub))
    90  		a, err := app.New(kanvas.Options{
    91  			Env: env,
    92  		})
    93  		require.NoError(t, os.Chdir(wd))
    94  		require.NoError(t, err)
    95  
    96  		gotErr := a.Export("githubactions", destDir, "kanvas:example")
    97  		if wantErr != "" {
    98  			require.EqualError(t, gotErr, wantErr)
    99  		} else {
   100  			require.NoError(t, gotErr)
   101  		}
   102  
   103  		destFiles, err := os.ReadDir(destDir)
   104  		require.NoError(t, err)
   105  
   106  		for _, f := range destFiles {
   107  			want, ok := exports[f.Name()]
   108  
   109  			got, err := os.ReadFile(filepath.Join(destDir, f.Name()))
   110  			assert.NoError(t, err)
   111  
   112  			assert.True(t, ok, "Unexpected file %q has been exported: %s", f.Name(), string(got))
   113  			assert.Equal(t, want, string(got))
   114  
   115  			if t.Failed() {
   116  				if os.Getenv("UPDATE_SNAPSHOT") == t.Name() {
   117  					fn := filepath.Join(exportsDir, f.Name())
   118  					require.Errorf(t, os.WriteFile(fn, got, 0666), "Saving snapshot at %s", fn)
   119  				} else {
   120  					t.Errorf("Rerun test with UPDATE_SNAPSHOT=%s in order to update the snapshot", t.Name())
   121  				}
   122  			}
   123  
   124  			delete(exports, f.Name())
   125  		}
   126  
   127  		for f := range exports {
   128  			t.Errorf("Expected %q to be exported", f)
   129  		}
   130  	})
   131  }