github.com/kubeshop/testkube@v1.17.23/contrib/executor/soapui/pkg/runner/runner_test.go (about) 1 package runner 2 3 import ( 4 "context" 5 "errors" 6 "os" 7 "path/filepath" 8 "testing" 9 10 "github.com/golang/mock/gomock" 11 "github.com/stretchr/testify/assert" 12 13 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 14 "github.com/kubeshop/testkube/pkg/envs" 15 "github.com/kubeshop/testkube/pkg/executor/scraper" 16 "github.com/kubeshop/testkube/pkg/utils/test" 17 ) 18 19 func TestRun_Integration(t *testing.T) { 20 test.IntegrationTest(t) 21 t.Skipf("Skipping integration test %s until it is installed in CI", t.Name()) 22 23 mockCtrl := gomock.NewController(t) 24 defer mockCtrl.Finish() 25 26 tempDir, err := os.MkdirTemp("", "*") 27 assert.NoErrorf(t, err, "failed to create temp dir: %v", err) 28 defer os.RemoveAll(tempDir) 29 30 testXML := "./example/REST-Project-1-soapui-project.xml" 31 writeTestContent(t, tempDir, testXML) 32 33 e := testkube.Execution{ 34 Id: "get_petstore", 35 TestName: "Get Petstore", 36 TestNamespace: "petstore", 37 TestType: "soapui/xml", 38 Name: "Testing GET", 39 Args: []string{"-c 'TestCase 1'"}, 40 Content: testkube.NewStringTestContent(""), 41 } 42 43 tests := []struct { 44 name string 45 testFileCreator func() (*os.File, error) 46 execution testkube.Execution 47 expectedError string 48 expectedStatus testkube.ExecutionStatus 49 scraperBuilder func() scraper.Scraper 50 }{ 51 { 52 name: "Successful test, successful scraper", 53 testFileCreator: createSuccessfulScript, 54 execution: e, 55 expectedError: "", 56 expectedStatus: *testkube.ExecutionStatusPassed, 57 scraperBuilder: func() scraper.Scraper { 58 s := scraper.NewMockScraper(mockCtrl) 59 s.EXPECT().Scrape(gomock.Any(), []string{"/logs"}, []string{}, gomock.Eq(e)).Return(nil) 60 return s 61 }, 62 }, 63 { 64 name: "Failing test, successful scraper", 65 testFileCreator: createFailingScript, 66 execution: e, 67 expectedError: "", 68 expectedStatus: *testkube.ExecutionStatusFailed, 69 scraperBuilder: func() scraper.Scraper { 70 s := scraper.NewMockScraper(mockCtrl) 71 s.EXPECT().Scrape(gomock.Any(), []string{"/logs"}, []string{}, gomock.Eq(e)).Return(nil) 72 return s 73 }, 74 }, 75 { 76 name: "Successful test, failing scraper", 77 testFileCreator: createSuccessfulScript, 78 execution: e, 79 expectedError: "error scraping artifacts from SoapUI executor: Scraping failed", 80 expectedStatus: *testkube.ExecutionStatusPassed, 81 scraperBuilder: func() scraper.Scraper { 82 s := scraper.NewMockScraper(mockCtrl) 83 s.EXPECT().Scrape(gomock.Any(), []string{"/logs"}, []string{}, gomock.Eq(e)).Return(errors.New("Scraping failed")) 84 return s 85 }, 86 }, 87 { 88 name: "Failing test, failing scraper", 89 testFileCreator: createFailingScript, 90 execution: e, 91 expectedError: "error scraping artifacts from SoapUI executor: Scraping failed", 92 expectedStatus: *testkube.ExecutionStatusFailed, 93 scraperBuilder: func() scraper.Scraper { 94 s := scraper.NewMockScraper(mockCtrl) 95 s.EXPECT().Scrape(gomock.Any(), []string{"/logs"}, []string{}, gomock.Eq(e)).Return(errors.New("Scraping failed")) 96 return s 97 }, 98 }, 99 } 100 101 for i := range tests { 102 test := tests[i] 103 t.Run(test.name, func(t *testing.T) { 104 t.Parallel() 105 106 file, err := test.testFileCreator() 107 assert.NoError(t, err) 108 defer file.Close() 109 params := envs.Params{DataDir: tempDir, ScrapperEnabled: true} 110 runner := SoapUIRunner{ 111 SoapUILogsPath: "/logs", 112 Params: params, 113 Scraper: test.scraperBuilder(), 114 } 115 116 test.execution.Command = []string{ 117 "/bin/sh", 118 file.Name(), 119 } 120 test.execution.Args = []string{ 121 "<runPath>", 122 } 123 res, err := runner.Run(context.Background(), test.execution) 124 if test.expectedError == "" { 125 assert.NoError(t, err) 126 } else { 127 assert.EqualError(t, err, test.expectedError) 128 } 129 130 assert.Equal(t, test.expectedStatus, *res.Status) 131 }) 132 } 133 } 134 135 func createSuccessfulScript() (*os.File, error) { 136 file, err := os.CreateTemp("", "successful_script") 137 if err != nil { 138 return nil, err 139 } 140 141 _, err = file.WriteString("#!/bin/sh\nexit 0\n") 142 if err != nil { 143 return nil, err 144 } 145 146 return file, nil 147 } 148 149 func createFailingScript() (*os.File, error) { 150 file, err := os.CreateTemp("", "failing_script") 151 if err != nil { 152 return nil, err 153 } 154 155 _, err = file.WriteString("#!/bin/sh\nexit 1\n") 156 if err != nil { 157 return nil, err 158 } 159 160 return file, nil 161 } 162 163 func writeTestContent(t *testing.T, dir string, testScript string) { 164 soapuiScript, err := os.ReadFile(testScript) 165 if err != nil { 166 assert.FailNow(t, "Unable to read soapui test script") 167 } 168 169 err = os.WriteFile(filepath.Join(dir, "test-content"), soapuiScript, 0644) 170 if err != nil { 171 assert.FailNow(t, "Unable to write soapui runner test content file") 172 } 173 }