package services import ( "context" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "edge-infra.dev/pkg/edge/api/graph/model" sqlquery "edge-infra.dev/pkg/edge/api/sql" ) var ( action = &model.Action{ ActionID: "ac8536ff-d463-4aff-8fa9-fe81fec1ddc1", Input: "input", Action: "delete", Username: "username", Status: "SUCCESS", Error: nil, Time: "2023-05-18 19:21:29.661274+00", BannerEdgeID: &BannerEdgeID, ClusterEdgeID: &ClusterEdgeID, TenantEdgeID: "te8536ff-d463-4aff-8fa9-fe81fec1ddc1", BatchID: &BatchID, } action2 = model.Action{ ActionID: "ac8536ff-d463-4aff-8fa9-fe81fec1ddc2", Input: "input2", Action: "delete2", Username: "username2", Status: "SUCCESS", Error: nil, Time: "2023-05-20 19:21:29.661274+00", BannerEdgeID: &BannerEdgeID, ClusterEdgeID: &ClusterEdgeID, TenantEdgeID: "te8536ff-d463-4aff-8fa9-fe81fec1ddc2", BatchID: &BatchID, } Username = "username" BannerEdgeID = "ba8536ff-d463-4aff-8fa9-fe81fec1ddc1" ClusterEdgeID = "cl8536ff-d463-4aff-8fa9-fe81fec1ddc1" TenantEdgeID = "te8536ff-d463-4aff-8fa9-fe81fec1ddc1" BatchID = "batch6ff-d463-4aff-8fa9-fe81fec1ddc1" ) func TestGetActions(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() service := NewActivityService(appConfig, db) type test struct { testName string username *string bannerEdgeID *string clusterEdgeID *string batchID *string actionFilt *string statusFilt *string tenantEdgeID string expect []*model.Action mockActionsSQLQuery func() *sqlmock.ExpectedQuery mockCountActionsSQLQuery func() *sqlmock.ExpectedQuery } tests := []test{ {testName: "queryByUsername", username: &Username, bannerEdgeID: nil, clusterEdgeID: nil, tenantEdgeID: TenantEdgeID, batchID: nil, actionFilt: &action.Action, statusFilt: (*string)(&action.Status), expect: []*model.Action{action}, mockActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery). WithArgs(Username, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1). WillReturnRows(sqlmock.NewRows([]string{ "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}). AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time)) }, mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsCount). WithArgs(Username, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID). WillReturnRows(sqlmock.NewRows([]string{"count"}). AddRow(1)) }, }, {testName: "queryByBannerEdgeID", username: nil, bannerEdgeID: &BannerEdgeID, clusterEdgeID: nil, tenantEdgeID: TenantEdgeID, batchID: nil, actionFilt: &action.Action, statusFilt: (*string)(&action.Status), expect: []*model.Action{action}, mockActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery). WithArgs(nil, action.BannerEdgeID, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1). WillReturnRows(sqlmock.NewRows([]string{ "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}). AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time)) }, mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsCount). WithArgs(nil, action.BannerEdgeID, nil, nil, action.Action, action.Status, action.TenantEdgeID). WillReturnRows(sqlmock.NewRows([]string{"count"}). AddRow(1)) }, }, {testName: "queryByClusterEdgeID", username: nil, bannerEdgeID: nil, clusterEdgeID: &ClusterEdgeID, tenantEdgeID: TenantEdgeID, batchID: nil, actionFilt: &action.Action, statusFilt: (*string)(&action.Status), expect: []*model.Action{action}, mockActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery). WithArgs(nil, nil, action.ClusterEdgeID, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1). WillReturnRows(sqlmock.NewRows([]string{ "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}). AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time)) }, mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsCount). WithArgs(nil, nil, action.ClusterEdgeID, nil, action.Action, action.Status, action.TenantEdgeID). WillReturnRows(sqlmock.NewRows([]string{"count"}). AddRow(1)) }, }, {testName: "queryByBatchID", username: nil, bannerEdgeID: nil, clusterEdgeID: nil, tenantEdgeID: TenantEdgeID, batchID: &BatchID, actionFilt: &action.Action, statusFilt: (*string)(&action.Status), expect: []*model.Action{action}, mockActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery). WithArgs(nil, nil, nil, action.BatchID, action.Action, action.Status, action.TenantEdgeID, action.Time, 1). WillReturnRows(sqlmock.NewRows([]string{ "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}). AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time)) }, mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsCount). WithArgs(nil, nil, nil, action.BatchID, action.Action, action.Status, action.TenantEdgeID). WillReturnRows(sqlmock.NewRows([]string{"count"}). AddRow(1)) }, }, {testName: "queryByDefaultTenantEdgeID", username: nil, bannerEdgeID: nil, clusterEdgeID: nil, tenantEdgeID: TenantEdgeID, batchID: nil, actionFilt: &action.Action, statusFilt: (*string)(&action.Status), expect: []*model.Action{action}, mockActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsByCatchAllQuery). WithArgs(nil, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID, action.Time, 1). WillReturnRows(sqlmock.NewRows([]string{ "action_id", "input", "action", "username", "tenant_edge_id", "banner_edge_id", "cluster_edge_id", "batch_id", "status", "error", "time_done"}). AddRow(action.ActionID, action.Input, action.Action, action.Username, action.TenantEdgeID, action.BannerEdgeID, action.ClusterEdgeID, action.BatchID, action.Status, action.Error, action.Time)) }, mockCountActionsSQLQuery: func() *sqlmock.ExpectedQuery { return mock.ExpectQuery(sqlquery.GetActionsCount). WithArgs(nil, nil, nil, nil, action.Action, action.Status, action.TenantEdgeID). WillReturnRows(sqlmock.NewRows([]string{"count"}). AddRow(1)) }, }, } for _, tc := range tests { tc.mockCountActionsSQLQuery() tc.mockActionsSQLQuery() t.Run(tc.testName, func(t *testing.T) { actions, count, err := service.GetActions(context.Background(), tc.username, tc.bannerEdgeID, tc.clusterEdgeID, tc.batchID, &action.Action, tc.statusFilt, tc.tenantEdgeID, action.Time, 1, false) assert.Equal(t, actions, tc.expect) assert.Equal(t, actions[0], action) assert.NoError(t, err) assert.Equal(t, count, 1) err = mock.ExpectationsWereMet() assert.NoError(t, err) }) } } func TestCreateAction(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.ExpectExec(sqlquery.CreateActionEntry).WithArgs(action2.Input, action2.Action, action2.Username, action2.TenantEdgeID, action2.BannerEdgeID, action2.ClusterEdgeID, action2.BatchID, action2.Status, action2.Error, sqlmock.AnyArg()). WillReturnResult(sqlmock.NewResult(1, 1)) service := NewActivityService(appConfig, db) err = service.CreateAction(context.Background(), action2) assert.NoError(t, err) err = mock.ExpectationsWereMet() assert.NoError(t, err) }