package services import ( "context" "testing" "edge-infra.dev/pkg/edge/api/graph/model" sqlquery "edge-infra.dev/pkg/edge/api/sql" "edge-infra.dev/pkg/edge/api/testutils/seededpostgres" "edge-infra.dev/pkg/edge/constants/api/fleet" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" ) var ( artifactVersionA = model.ArtifactVersion{ Name: fleet.Store, Version: "0.15", } artifactVersionB = model.ArtifactVersion{ Name: fleet.Store, Version: "0.13", } compatibleArtifactVersionA = model.ArtifactVersion{ Name: "edge-os", Version: "1.9", } compatibleArtifactVersionB = model.ArtifactVersion{ Name: "edge-os", Version: "1.8", } compatibleArtifactVersionC = model.ArtifactVersion{ Name: "edge-os", Version: "2.0", } ) func TestGetArtifactVersionCompatibility(t *testing.T) { db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual)) if err != nil { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } defer db.Close() mock.ExpectQuery(sqlquery.GetArtifactVersionsAndCompatibility).WithArgs(artifactVersionA.Name, artifactVersionA.Version). WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version", "nth_index", "compatible_artifact_name", "compatible_artifact_version"}). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionA.Name, compatibleArtifactVersionA.Version). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionB.Name, compatibleArtifactVersionB.Version)) svc := NewCompatibilityService(db) result, err := svc.GetArtifactVersionCompatibility(context.Background(), artifactVersionA, nil) assert.NoError(t, err) assert.Len(t, result.CompatibleArtifacts, 2) assert.NoError(t, mock.ExpectationsWereMet()) } func TestIsCompatible(t *testing.T) { db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual)) if err != nil { t.Fatalf("an error '%s' was not expected when opening a stub database connection", err) } defer db.Close() mock.ExpectQuery(sqlquery.GetArtifactVersionsAndCompatibility).WithArgs(artifactVersionA.Name, artifactVersionA.Version). WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version", "nth_index", "compatible_artifact_name", "compatible_artifact_version"}). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionA.Name, compatibleArtifactVersionA.Version). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionB.Name, compatibleArtifactVersionB.Version)) svc := NewCompatibilityService(db) // test compatible artifact result, err := svc.IsCompatible(context.Background(), artifactVersionA, compatibleArtifactVersionA) assert.NoError(t, err) assert.True(t, result) assert.NoError(t, mock.ExpectationsWereMet()) mock.ExpectQuery(sqlquery.GetArtifactVersionsAndCompatibility).WithArgs(artifactVersionA.Name, artifactVersionA.Version). WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version", "nth_index", "compatible_artifact_name", "compatible_artifact_version"}). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionA.Name, compatibleArtifactVersionA.Version). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionB.Name, compatibleArtifactVersionB.Version)) // test incompatible artifact result, err = svc.IsCompatible(context.Background(), artifactVersionA, compatibleArtifactVersionC) assert.NoError(t, err) assert.False(t, result) assert.NoError(t, mock.ExpectationsWereMet()) mock.ExpectQuery(sqlquery.GetArtifactVersionsAndCompatibility).WithArgs(artifactVersionA.Name, artifactVersionA.Version). WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version", "nth_index", "compatible_artifact_name", "compatible_artifact_version"}). AddRow(artifactVersionA.Name, artifactVersionA.Version, 2, compatibleArtifactVersionA.Name, compatibleArtifactVersionA.Version)) //test supported artifact result, err = svc.IsCompatible(context.Background(), artifactVersionA, artifactVersionB) assert.NoError(t, err) assert.True(t, result) assert.NoError(t, mock.ExpectationsWereMet()) mock.ExpectQuery(sqlquery.GetArtifactVersionsAndCompatibility).WithArgs(artifactVersionA.Name, artifactVersionA.Version). WillReturnRows(mock.NewRows([]string{"artifact_name", "artifact_version", "nth_index", "compatible_artifact_name", "compatible_artifact_version"}). AddRow(artifactVersionA.Name, artifactVersionA.Version, 1, compatibleArtifactVersionA.Name, compatibleArtifactVersionA.Version)) //test unsupported artifact result, err = svc.IsCompatible(context.Background(), artifactVersionA, artifactVersionB) assert.NoError(t, err) assert.False(t, result) assert.NoError(t, mock.ExpectationsWereMet()) } func TestCompatibilityService(t *testing.T) { ctx := context.Background() sp, err := seededpostgres.New() if err != nil { t.Fatal(err) } defer sp.Close() db, err := sp.DB() if err != nil { t.Fatal(err) } defer db.Close() svc := NewCompatibilityService(db) compatibility := model.ArtifactCompatibilityPayload{ Artifact: &model.ArtifactInput{ Name: artifactVersionA.Name, Version: artifactVersionA.Version, }, CompatibleArtifacts: []*model.ArtifactInput{ { Name: compatibleArtifactVersionC.Name, Version: compatibleArtifactVersionC.Version, }, }, } added, err := svc.AddArtifactCompatibility(ctx, compatibility) assert.NoError(t, err) assert.True(t, added) addedCompatibleArtifacts, err := svc.GetArtifactVersionCompatibility(ctx, artifactVersionA, nil) assert.NoError(t, err) assert.Len(t, addedCompatibleArtifacts.CompatibleArtifacts, 3) deleted, err := svc.DeleteArtifactCompatibility(ctx, compatibility) assert.NoError(t, err) assert.True(t, deleted) deletedCompatibleArtifacts, err := svc.GetArtifactVersionCompatibility(ctx, artifactVersionA, nil) assert.NoError(t, err) assert.Len(t, deletedCompatibleArtifacts.CompatibleArtifacts, 2) }