...

Source file src/edge-infra.dev/pkg/edge/api/services/artifacts/artifacts_service_test.go

Documentation: edge-infra.dev/pkg/edge/api/services/artifacts

     1  package artifacts
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/DATA-DOG/go-sqlmock"
     8  	"github.com/google/uuid"
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	clustersvc "edge-infra.dev/pkg/edge/api/services/cluster"
    12  	clusterlabel "edge-infra.dev/pkg/edge/api/services/cluster/label"
    13  	sqlquery "edge-infra.dev/pkg/edge/api/sql"
    14  	"edge-infra.dev/pkg/edge/constants/api/fleet"
    15  	"edge-infra.dev/pkg/lib/runtime/version"
    16  )
    17  
    18  func TestGetClusterArtifactVersions(t *testing.T) {
    19  	ceid := uuid.NewString()
    20  	fversion := "sha256:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a" //nolint
    21  
    22  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
    23  	if err != nil {
    24  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    25  	}
    26  	defer db.Close()
    27  
    28  	mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
    29  		WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, fversion))
    30  
    31  	svc := NewArtifactsService(db, nil)
    32  	result, err := svc.GetClusterArtifactVersions(context.Background(), ceid)
    33  	assert.NoError(t, err)
    34  	assert.Len(t, result, 1)
    35  	assert.NoError(t, mock.ExpectationsWereMet())
    36  }
    37  
    38  func TestUpdateClusterFleetVersionAndArtifact(t *testing.T) {
    39  	ceid := uuid.NewString()
    40  	fversion := "0.14"
    41  
    42  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
    43  	if err != nil {
    44  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
    45  	}
    46  	defer db.Close()
    47  
    48  	mock.ExpectQuery(clusterlabel.FetchFleetType).WithArgs(ceid).
    49  		WillReturnRows(mock.NewRows([]string{"label_key"}).AddRow(fleet.Store))
    50  
    51  	mock.ExpectBegin()
    52  	mock.ExpectExec(sqlquery.UpdateClusterFleetVersion).WithArgs(ceid, fversion).WillReturnResult(sqlmock.NewResult(1, 1))
    53  	mock.ExpectExec(sqlquery.UpdateClusterArtifactVersions).WithArgs(ceid, fversion).WillReturnResult(sqlmock.NewResult(1, 1))
    54  	mock.ExpectCommit()
    55  
    56  	clusterLabelSvc := clustersvc.NewLabelService(db)
    57  	svc := NewArtifactsService(db, clusterLabelSvc)
    58  	assert.NoError(t, svc.UpdateClusterFleetVersionAndArtifact(context.Background(), ceid, fversion))
    59  	assert.NoError(t, mock.ExpectationsWereMet())
    60  }
    61  
    62  func TestUpdateClusterFleetVersionAndArtifact_Validation(t *testing.T) {
    63  	type tc struct {
    64  		fleet   string
    65  		version string
    66  		valid   bool
    67  	}
    68  
    69  	tcs := []tc{
    70  		// valid
    71  		{fleet: fleet.Store, version: "0.14", valid: true},
    72  		{fleet: fleet.Store, version: "sha256:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a", valid: true},
    73  		{
    74  			// probably meant to be a digest, but is technically a valid tag
    75  			fleet: fleet.Store, version: "d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64", valid: true,
    76  		},
    77  		// invalid
    78  		{fleet: fleet.Store, version: "", valid: false},
    79  		{fleet: fleet.Store, version: "sha255:d00a39e1a5dce242e7928cb8377df2540197f9d8710f2e6ccd620cb2e324a64a", valid: false},
    80  		{fleet: fleet.Store, version: "", valid: false},
    81  		{fleet: fleet.Store, version: "-api.quan", valid: false},
    82  		{fleet: fleet.Store, version: "-api/quan", valid: false},
    83  		{fleet: fleet.Store, version: ".14", valid: false},
    84  		{fleet: "", version: "0.14", valid: false},
    85  		{fleet: "sto re", version: "0.14", valid: false},
    86  		{fleet: "store ", version: ":0.14", valid: false},
    87  		{fleet: "store ", version: ".14", valid: false},
    88  	}
    89  
    90  	for _, test := range tcs {
    91  		err := validateWeakImageRef(test.fleet, test.version)
    92  		if test.valid {
    93  			assert.NoError(t, err, test)
    94  		} else {
    95  			assert.Error(t, err, test)
    96  		}
    97  	}
    98  }
    99  
   100  func TestGetAvailableArtifactVersions(t *testing.T) {
   101  	fversion := "0.X-test"
   102  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   103  	if err != nil {
   104  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   105  	}
   106  	defer db.Close()
   107  
   108  	mock.ExpectQuery(sqlquery.GetAvailableArtifactVersions).WithArgs(fleet.Store).
   109  		WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, fversion))
   110  
   111  	svc := NewArtifactsService(db, nil)
   112  	result, err := svc.GetAvailableArtifactVersions(context.Background(), fleet.Store)
   113  	assert.NoError(t, err)
   114  	assert.Len(t, result, 1)
   115  	assert.NoError(t, mock.ExpectationsWereMet())
   116  }
   117  
   118  func TestGetLatestAvailableArtifactVersion(t *testing.T) {
   119  	fversion := "X.Y.Z-test"
   120  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   121  	if err != nil {
   122  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   123  	}
   124  	defer db.Close()
   125  
   126  	mock.ExpectQuery(sqlquery.GetLatestAvailableArtifactVersion).WithArgs(fleet.Store).
   127  		WillReturnRows(mock.NewRows([]string{"version_str"}).AddRow(fversion))
   128  
   129  	svc := NewArtifactsService(db, nil)
   130  	result, err := svc.GetLatestAvailableArtifactVersion(context.Background(), fleet.Store)
   131  	assert.NoError(t, err)
   132  	assert.Equal(t, fversion, result.Version)
   133  	assert.NoError(t, mock.ExpectationsWereMet())
   134  }
   135  
   136  func TestAddClusterArtifactVersion(t *testing.T) {
   137  	ctx := context.Background()
   138  	ceid := uuid.NewString()
   139  	artifactVersion := "0.18"
   140  	artifactName := "distributed-storage"
   141  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   142  	if err != nil {
   143  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   144  	}
   145  	defer db.Close()
   146  	mock.ExpectBegin()
   147  	tx, _ := db.Begin()
   148  	mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
   149  		WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(fleet.Store, artifactVersion))
   150  	mock.ExpectQuery(clusterlabel.FetchFleetType).WithArgs(ceid).
   151  		WillReturnRows(mock.NewRows([]string{"label_key"}).AddRow(fleet.Store))
   152  	mock.ExpectExec(sqlquery.CreateClusterArtifactVersion).WithArgs(ceid, artifactName, artifactVersion).WillReturnResult(sqlmock.NewResult(1, 1))
   153  	mock.ExpectCommit()
   154  	clusterLabelSvc := clustersvc.NewLabelService(db)
   155  	svc := NewArtifactsService(db, clusterLabelSvc)
   156  	assert.NoError(t, svc.AddClusterArtifactVersion(ctx, tx, ceid, artifactName))
   157  	assert.NoError(t, tx.Commit())
   158  	assert.NoError(t, mock.ExpectationsWereMet())
   159  }
   160  
   161  func TestDeleteClusterArtifactVersion(t *testing.T) {
   162  	ctx := context.Background()
   163  	ceid := uuid.NewString()
   164  	artifactName := "distributed-storage"
   165  	version := version.New()
   166  	db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
   167  	if err != nil {
   168  		t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
   169  	}
   170  	defer db.Close()
   171  
   172  	mock.ExpectBegin()
   173  	tx, _ := db.Begin()
   174  	mock.ExpectQuery(sqlquery.GetClusterArtifactVersions).WithArgs(ceid).
   175  		WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version"}).AddRow(artifactName, version.SemVer))
   176  	mock.ExpectExec(sqlquery.DeleteClusterArtifactVersion).WithArgs(ceid, artifactName).WillReturnResult(sqlmock.NewResult(1, 1))
   177  	mock.ExpectCommit()
   178  	svc := NewArtifactsService(db, nil)
   179  	assert.NoError(t, svc.DeleteClusterArtifactVersion(ctx, tx, ceid, artifactName))
   180  	assert.NoError(t, tx.Commit())
   181  	assert.NoError(t, mock.ExpectationsWereMet())
   182  }
   183  

View as plain text