Skip to content

Commit f960d62

Browse files
committed
refactor: test on test deploy job specification when success
1 parent 89559f6 commit f960d62

3 files changed

Lines changed: 357 additions & 117 deletions

File tree

api/handler/v1beta1/job_test.go

Lines changed: 124 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -6,138 +6,146 @@ import (
66
"testing"
77
"time"
88

9+
"github.com/google/uuid"
910
v1 "github.com/odpf/optimus/api/handler/v1beta1"
1011
pb "github.com/odpf/optimus/api/proto/odpf/optimus/core/v1beta1"
12+
"github.com/odpf/optimus/core/progress"
1113

12-
"github.com/google/uuid"
1314
"github.com/odpf/optimus/mock"
1415
"github.com/odpf/optimus/models"
1516
"github.com/odpf/salt/log"
1617
"github.com/stretchr/testify/assert"
1718
mock2 "github.com/stretchr/testify/mock"
19+
"github.com/stretchr/testify/suite"
1820
)
1921

20-
func TestJobSpecificationOnServer(t *testing.T) {
21-
log := log.NewNoop()
22-
ctx := context.Background()
23-
24-
t.Run("DeployJobSpecification", func(t *testing.T) {
25-
t.Run("should deploy the job", func(t *testing.T) {
26-
Version := "1.0.1"
27-
28-
projectName := "a-data-project"
29-
jobName1 := "a-data-job"
30-
taskName := "a-data-task"
31-
32-
projectSpec := models.ProjectSpec{
33-
ID: uuid.Must(uuid.NewRandom()),
34-
Name: projectName,
35-
Config: map[string]string{
36-
"bucket": "gs://some_folder",
37-
},
38-
}
39-
40-
namespaceSpec := models.NamespaceSpec{
41-
ID: uuid.Must(uuid.NewRandom()),
42-
Name: "dev-test-namespace-1",
43-
Config: map[string]string{
44-
"bucket": "gs://some_folder",
45-
},
46-
ProjectSpec: projectSpec,
47-
}
48-
49-
execUnit1 := new(mock.BasePlugin)
50-
execUnit1.On("PluginInfo").Return(&models.PluginInfoResponse{
51-
Name: taskName,
52-
}, nil)
53-
defer execUnit1.AssertExpectations(t)
54-
55-
jobSpecs := []models.JobSpec{
56-
{
57-
Name: jobName1,
58-
Task: models.JobSpecTask{
59-
Unit: &models.Plugin{
60-
Base: execUnit1,
61-
},
62-
Config: models.JobSpecConfigs{
63-
{
64-
Name: "do",
65-
Value: "this",
66-
},
67-
},
68-
},
69-
Assets: *models.JobAssets{}.New(
70-
[]models.JobSpecAsset{
71-
{
72-
Name: "query.sql",
73-
Value: "select * from 1",
74-
},
75-
}),
76-
},
77-
}
78-
79-
jobSpecRepository := new(mock.JobSpecRepository)
80-
defer jobSpecRepository.AssertExpectations(t)
81-
82-
jobSpecRepoFactory := new(mock.JobSpecRepoFactory)
83-
defer jobSpecRepoFactory.AssertExpectations(t)
84-
85-
pluginRepo := new(mock.SupportedPluginRepo)
86-
pluginRepo.On("GetByName", taskName).Return(&models.Plugin{
87-
Base: execUnit1,
88-
}, nil)
89-
adapter := v1.NewAdapter(pluginRepo, nil)
90-
91-
nsService := new(mock.NamespaceService)
92-
nsService.On("Get", ctx, projectSpec.Name, namespaceSpec.Name).Return(namespaceSpec, nil)
93-
defer nsService.AssertExpectations(t)
94-
95-
projectJobSpecRepository := new(mock.ProjectJobSpecRepository)
96-
defer projectJobSpecRepository.AssertExpectations(t)
97-
98-
projectJobSpecRepoFactory := new(mock.ProjectJobSpecRepoFactory)
99-
defer projectJobSpecRepoFactory.AssertExpectations(t)
100-
101-
jobService := new(mock.JobService)
102-
jobService.On("Create", ctx, mock2.Anything, namespaceSpec).Return(nil)
103-
jobService.On("KeepOnly", ctx, namespaceSpec, mock2.Anything, mock2.Anything).Return(nil)
104-
jobService.On("Sync", mock2.Anything, namespaceSpec, mock2.Anything).Return(nil)
105-
defer jobService.AssertExpectations(t)
22+
type RuntimeServiceServerTestSuite struct {
23+
suite.Suite
24+
version string
25+
ctx context.Context
26+
namespaceService *mock.NamespaceService
27+
projectService *mock.ProjectService
28+
secretService *mock.SecretService
29+
runService *mock.RunService // TODO: refactor to service package
30+
jobService *mock.JobService // TODO: refactor to service package
31+
resourceService models.DatastoreService // TODO: refactor to service package
32+
jobEventService v1.JobEventService // TODO: refactor to service package
33+
adapter *mock.ProtoAdapter
34+
scheduler models.SchedulerUnit
35+
log log.Logger
36+
progressObserver progress.Observer
37+
38+
req *pb.DeployJobSpecificationRequest
39+
projectSpec models.ProjectSpec
40+
namespaceSpec models.NamespaceSpec
41+
}
10642

107-
jobSpecsAdapted := []*pb.JobSpecification{}
108-
for _, jobSpec := range jobSpecs {
109-
jobSpecAdapted, _ := adapter.ToJobProto(jobSpec)
110-
jobSpecsAdapted = append(jobSpecsAdapted, jobSpecAdapted)
111-
}
43+
func (s *RuntimeServiceServerTestSuite) SetupTest() {
44+
s.version = "v1.0.0"
45+
s.ctx = context.Background()
46+
s.namespaceService = new(mock.NamespaceService)
47+
s.adapter = new(mock.ProtoAdapter)
48+
s.jobService = new(mock.JobService)
49+
s.log = log.NewNoop()
50+
// ... etdc
51+
52+
s.projectSpec = models.ProjectSpec{}
53+
s.projectSpec.Name = "project-a"
54+
s.projectSpec.ID = uuid.MustParse("26a0d6a0-13c6-4b30-ae6f-29233df70f31")
55+
56+
s.namespaceSpec = models.NamespaceSpec{}
57+
s.namespaceSpec.Name = "ns1"
58+
s.namespaceSpec.ID = uuid.MustParse("ceba7919-e07d-48b4-a4ce-141d79a3b59d")
59+
60+
s.req = &pb.DeployJobSpecificationRequest{}
61+
s.req.ProjectName = s.projectSpec.Name
62+
s.req.NamespaceName = s.namespaceSpec.Name
63+
}
11264

113-
grpcRespStream := new(mock.DeployJobSpecificationServer)
114-
grpcRespStream.On("Context").Return(context.Background())
115-
recv := &pb.DeployJobSpecificationRequest{ProjectName: projectName, Jobs: jobSpecsAdapted, NamespaceName: namespaceSpec.Name}
116-
grpcRespStream.On("Recv").Return(recv, nil).Once()
117-
grpcRespStream.On("Recv").Return(nil, io.EOF).Once()
118-
grpcRespStream.On("Send", mock2.Anything).Return(nil)
119-
defer grpcRespStream.AssertExpectations(t)
65+
func TestRuntimeServiceServerTestSuite(t *testing.T) {
66+
s := new(RuntimeServiceServerTestSuite)
67+
suite.Run(t, s)
68+
}
12069

121-
runtimeServiceServer := v1.NewRuntimeServiceServer(
122-
log,
123-
Version,
124-
jobService,
125-
nil, nil,
126-
nil,
127-
nsService,
128-
nil,
129-
adapter,
130-
nil,
131-
nil,
132-
nil,
133-
)
70+
func (s *RuntimeServiceServerTestSuite) newRuntimeServiceServer() *v1.RuntimeServiceServer {
71+
return v1.NewRuntimeServiceServer(
72+
s.log,
73+
s.version,
74+
s.jobService,
75+
s.jobEventService,
76+
s.resourceService,
77+
s.projectService,
78+
s.namespaceService,
79+
s.secretService,
80+
s.adapter,
81+
s.progressObserver,
82+
s.runService,
83+
s.scheduler,
84+
)
85+
}
13486

135-
err := runtimeServiceServer.DeployJobSpecification(grpcRespStream)
87+
func (s *RuntimeServiceServerTestSuite) TestDeployJobSpecification_Success() {
88+
s.Run("NoJobSpec", func() {
89+
stream := new(mock.DeployJobSpecificationServer)
90+
stream.On("Context").Return(s.ctx)
91+
stream.On("Recv").Return(s.req, nil).Once()
92+
stream.On("Recv").Return(nil, io.EOF).Once()
93+
94+
s.namespaceService.On("Get", s.ctx, s.req.GetProjectName(), s.req.GetNamespaceName()).Return(s.namespaceSpec, nil).Once()
95+
s.jobService.On("KeepOnly", s.ctx, s.namespaceSpec, mock2.Anything, mock2.Anything).Return(nil).Once()
96+
s.jobService.On("Sync", s.ctx, s.namespaceSpec, mock2.Anything).Return(nil).Once()
97+
stream.On("Send", mock2.Anything).Return(nil).Once()
98+
99+
runtimeServiceServer := s.newRuntimeServiceServer()
100+
err := runtimeServiceServer.DeployJobSpecification(stream)
101+
102+
s.Assert().NoError(err)
103+
stream.AssertExpectations(s.T())
104+
s.namespaceService.AssertExpectations(s.T())
105+
s.jobService.AssertExpectations(s.T())
106+
})
136107

137-
assert.NoError(t, err)
138-
})
108+
s.Run("TwoJobSpec", func() {
109+
jobSpecs := []*pb.JobSpecification{}
110+
jobSpecs = append(jobSpecs, &pb.JobSpecification{Name: "job-1"})
111+
jobSpecs = append(jobSpecs, &pb.JobSpecification{Name: "job-2"})
112+
s.req.Jobs = jobSpecs
113+
adaptedJobs := []models.JobSpec{}
114+
adaptedJobs = append(adaptedJobs, models.JobSpec{Name: "job-1"})
115+
adaptedJobs = append(adaptedJobs, models.JobSpec{Name: "job-2"})
116+
117+
stream := new(mock.DeployJobSpecificationServer)
118+
stream.On("Context").Return(s.ctx)
119+
stream.On("Recv").Return(s.req, nil).Once()
120+
stream.On("Recv").Return(nil, io.EOF).Once()
121+
122+
s.namespaceService.On("Get", s.ctx, s.req.GetProjectName(), s.req.GetNamespaceName()).Return(s.namespaceSpec, nil).Once()
123+
for i := range jobSpecs {
124+
s.adapter.On("FromJobProto", jobSpecs[i]).Return(adaptedJobs[i], nil).Once()
125+
s.jobService.On("Create", s.ctx, s.namespaceSpec, adaptedJobs[i]).Return(nil).Once()
126+
}
127+
s.jobService.On("KeepOnly", s.ctx, s.namespaceSpec, adaptedJobs, mock2.Anything).Return(nil).Once()
128+
s.jobService.On("Sync", s.ctx, s.namespaceSpec, mock2.Anything).Return(nil).Once()
129+
stream.On("Send", mock2.Anything).Return(nil).Once()
130+
131+
runtimeServiceServer := s.newRuntimeServiceServer()
132+
err := runtimeServiceServer.DeployJobSpecification(stream)
133+
134+
s.Assert().NoError(err)
135+
stream.AssertExpectations(s.T())
136+
s.adapter.AssertExpectations(s.T())
137+
s.namespaceService.AssertExpectations(s.T())
138+
s.jobService.AssertExpectations(s.T())
139139
})
140+
}
141+
142+
func (s *RuntimeServiceServerTestSuite) TestDeployJobSpecification_Fail() {
143+
}
140144

145+
// TODO: refactor to test suite
146+
func TestJobSpecificationOnServer(t *testing.T) {
147+
log := log.NewNoop()
148+
ctx := context.Background()
141149
t.Run("GetJobSpecification", func(t *testing.T) {
142150
t.Run("should read a job spec", func(t *testing.T) {
143151
Version := "1.0.1"
@@ -287,7 +295,7 @@ func TestJobSpecificationOnServer(t *testing.T) {
287295
}
288296

289297
jobSvc := new(mock.JobService)
290-
jobSvc.On("Create", ctx, jobSpec, namespaceSpec).Return(nil)
298+
jobSvc.On("Create", ctx, namespaceSpec, jobSpec).Return(nil)
291299
jobSvc.On("Check", ctx, namespaceSpec, []models.JobSpec{jobSpec}, mock2.Anything).Return(nil)
292300
jobSvc.On("Sync", mock2.Anything, namespaceSpec, mock2.Anything).Return(nil)
293301
defer jobSvc.AssertExpectations(t)

mock/job.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ type JobService struct {
128128
}
129129

130130
func (srv *JobService) Create(ctx context.Context, spec2 models.NamespaceSpec, spec models.JobSpec) error {
131-
args := srv.Called(ctx, spec, spec2)
131+
args := srv.Called(ctx, spec2, spec)
132132
return args.Error(0)
133133
}
134134

0 commit comments

Comments
 (0)