github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/export/manager_test.go (about)

     1  package export
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/turbot/steampipe/pkg/constants"
     8  )
     9  
    10  type testExporter struct {
    11  	alias     string
    12  	extension string
    13  	name      string
    14  }
    15  
    16  func (t *testExporter) Export(ctx context.Context, input ExportSourceData, destPath string) error {
    17  	return nil
    18  }
    19  func (t *testExporter) FileExtension() string { return t.extension }
    20  func (t *testExporter) Name() string          { return t.name }
    21  func (t *testExporter) Alias() string         { return t.alias }
    22  
    23  var dummyCSVExporter = testExporter{alias: "", extension: ".csv", name: "csv"}
    24  var dummyJSONExporter = testExporter{alias: "", extension: ".json", name: "json"}
    25  var dummyASFFExporter = testExporter{alias: "asff.json", extension: ".json", name: "asff"}
    26  var dummyNUNITExporter = testExporter{alias: "nunit3.xml", extension: ".xml", name: "nunit3"}
    27  var dummySPSExporter = testExporter{alias: "sps", extension: constants.SnapshotExtension, name: constants.OutputFormatSnapshot}
    28  
    29  type exporterTestCase struct {
    30  	name   string
    31  	input  string
    32  	expect interface{}
    33  }
    34  
    35  var exporterTestCases = []exporterTestCase{
    36  	{
    37  		name:   "Bad Format",
    38  		input:  "bad-format",
    39  		expect: "ERROR",
    40  	},
    41  	{
    42  		name:   "csv file name",
    43  		input:  "file.csv",
    44  		expect: &dummyCSVExporter,
    45  	},
    46  	{
    47  		name:   "csv format name",
    48  		input:  "csv",
    49  		expect: &dummyCSVExporter,
    50  	},
    51  	{
    52  		name:   "Snapshot file name",
    53  		input:  "file.sps",
    54  		expect: &dummySPSExporter,
    55  	},
    56  	{
    57  		name:   "Snapshot format name",
    58  		input:  "sps",
    59  		expect: &dummySPSExporter,
    60  	},
    61  	{
    62  		name:   "json file name",
    63  		input:  "file.json",
    64  		expect: &dummyJSONExporter,
    65  	},
    66  	{
    67  		name:   "json format name",
    68  		input:  "json",
    69  		expect: &dummyJSONExporter,
    70  	},
    71  	{
    72  		name:   "asff json file name",
    73  		input:  "file.asff.json",
    74  		expect: &dummyASFFExporter,
    75  	},
    76  	{
    77  		name:   "asff json format name",
    78  		input:  "asff.json",
    79  		expect: &dummyASFFExporter,
    80  	},
    81  	{
    82  		name:   "nunit3 file name",
    83  		input:  "file.nunit3.xml",
    84  		expect: &dummyNUNITExporter,
    85  	},
    86  	{
    87  		name:   "nunit3 format name",
    88  		input:  "nunit3.xml",
    89  		expect: &dummyNUNITExporter,
    90  	},
    91  }
    92  
    93  func TestDoExport(t *testing.T) {
    94  	exportersToRegister := []*testExporter{
    95  		&dummyJSONExporter,
    96  		&dummyCSVExporter,
    97  		&dummySPSExporter,
    98  		&dummyASFFExporter,
    99  		&dummyNUNITExporter,
   100  	}
   101  
   102  	m := NewManager()
   103  	for _, e := range exportersToRegister {
   104  		m.Register(e)
   105  	}
   106  	for _, testCase := range exporterTestCases {
   107  		targets, err := m.resolveTargetsFromArgs([]string{testCase.input}, "dummy_execution_name")
   108  		shouldError := testCase.expect == "ERROR"
   109  		if shouldError {
   110  			if err == nil {
   111  				t.Errorf("Request for '%s' should have errored - but did not", testCase.input)
   112  			}
   113  			continue
   114  		}
   115  		if !shouldError {
   116  			if err != nil {
   117  				t.Errorf("Request for '%s' should not have errored - but did: %v", testCase.input, err)
   118  			}
   119  			continue
   120  		}
   121  
   122  		if len(targets) != 1 {
   123  			t.Errorf("%v with %v input => expected one target - got %d", testCase.name, testCase.input, len(targets))
   124  			continue
   125  		}
   126  		actualTarget := targets[0]
   127  		expectedTargetExporter := testCase.expect.(*testExporter)
   128  
   129  		if actualTarget.exporter != expectedTargetExporter {
   130  			t.Errorf("%v with %v input => expected %s target - got %s", testCase.name, testCase.input, testCase.expect.(*testExporter).Name(), actualTarget.exporter.Name())
   131  			continue
   132  		}
   133  	}
   134  }