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  }