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  }