github.com/kubeshop/testkube@v1.17.23/pkg/repository/testresult/mongo_test.go (about) 1 //go:build integration 2 3 package testresult 4 5 import ( 6 "context" 7 "testing" 8 "time" 9 10 "github.com/kubeshop/testkube/pkg/repository/storage" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 15 "github.com/kubeshop/testkube/pkg/rand" 16 ) 17 18 const ( 19 mongoDns = "mongodb://localhost:27017" 20 mongoDbName = "testkube-test" 21 ) 22 23 func TestTestExecutionsMetrics(t *testing.T) { 24 assert := require.New(t) 25 26 repository, err := getRepository() 27 assert.NoError(err) 28 29 err = repository.Coll.Drop(context.TODO()) 30 assert.NoError(err) 31 32 testName := "example-test" 33 34 err = repository.insertExecutionResult(testName, testkube.FAILED_TestSuiteExecutionStatus, time.Now().Add(48*-time.Hour), map[string]string{"key1": "value1", "key2": "value2"}) 35 assert.NoError(err) 36 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Hour), map[string]string{"key1": "value1", "key2": "value2"}) 37 assert.NoError(err) 38 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(10*-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 39 assert.NoError(err) 40 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(10*-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 41 assert.NoError(err) 42 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 43 assert.NoError(err) 44 err = repository.insertExecutionResult(testName, testkube.FAILED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 45 assert.NoError(err) 46 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 47 assert.NoError(err) 48 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 49 assert.NoError(err) 50 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 51 assert.NoError(err) 52 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 53 assert.NoError(err) 54 err = repository.insertExecutionResult(testName, testkube.FAILED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 55 assert.NoError(err) 56 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 57 assert.NoError(err) 58 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 59 assert.NoError(err) 60 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 61 assert.NoError(err) 62 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 63 assert.NoError(err) 64 err = repository.insertExecutionResult(testName, testkube.FAILED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 65 assert.NoError(err) 66 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key1": "value1", "key2": "value2"}) 67 assert.NoError(err) 68 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 69 assert.NoError(err) 70 err = repository.insertExecutionResult(testName, testkube.FAILED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 71 assert.NoError(err) 72 err = repository.insertExecutionResult(testName, testkube.PASSED_TestSuiteExecutionStatus, time.Now().Add(-time.Minute), map[string]string{"key3": "value3", "key4": "value4"}) 73 assert.NoError(err) 74 75 metrics, err := repository.GetTestSuiteMetrics(context.Background(), testName, 100, 100) 76 assert.NoError(err) 77 78 t.Run("getting execution metrics for test data", func(t *testing.T) { 79 assert.NoError(err) 80 assert.Equal(int32(20), metrics.TotalExecutions) 81 assert.Equal(int32(5), metrics.FailedExecutions) 82 assert.Len(metrics.Executions, 20) 83 }) 84 85 t.Run("getting pass/fail ratio", func(t *testing.T) { 86 assert.Equal(float64(75), metrics.PassFailRatio) 87 }) 88 89 t.Run("getting percentiles of execution duration", func(t *testing.T) { 90 assert.Contains(metrics.ExecutionDurationP50, "1m0") 91 assert.Contains(metrics.ExecutionDurationP90, "10m0") 92 assert.Contains(metrics.ExecutionDurationP99, "48h0m0s") 93 }) 94 95 t.Run("limit should limit executions", func(t *testing.T) { 96 metrics, err := repository.GetTestSuiteMetrics(context.Background(), testName, 1, 100) 97 assert.NoError(err) 98 assert.Equal(1, len(metrics.Executions)) 99 }) 100 101 t.Run("filter last n days should limit executions", func(t *testing.T) { 102 metrics, err := repository.GetTestSuiteMetrics(context.Background(), testName, 100, 1) 103 assert.NoError(err) 104 assert.Equal(int32(19), metrics.TotalExecutions) 105 }) 106 } 107 108 func getRepository() (*MongoRepository, error) { 109 db, err := storage.GetMongoDatabase(mongoDns, mongoDbName, storage.TypeMongoDB, false, nil) 110 repository := NewMongoRepository(db, true, false) 111 return repository, err 112 } 113 114 func (r *MongoRepository) insertExecutionResult(testSuiteName string, execStatus testkube.TestSuiteExecutionStatus, startTime time.Time, labels map[string]string) error { 115 return r.Insert(context.Background(), 116 testkube.TestSuiteExecution{ 117 Id: rand.Name(), 118 TestSuite: &testkube.ObjectRef{Namespace: "testkube", Name: testSuiteName}, 119 Name: "dummyName", 120 StartTime: startTime, 121 EndTime: time.Now(), 122 Duration: time.Since(startTime).String(), 123 Labels: labels, 124 Status: &execStatus, 125 }) 126 }