@@ -15,6 +15,7 @@ import (
15
15
"github.com/jinzhu/gorm"
16
16
"github.com/stretchr/testify/assert"
17
17
18
+ "github.com/caraml-dev/mlp/api/config"
18
19
"github.com/caraml-dev/mlp/api/it/database"
19
20
"github.com/caraml-dev/mlp/api/models"
20
21
"github.com/caraml-dev/mlp/api/repository"
@@ -206,7 +207,10 @@ func TestCreateProject(t *testing.T) {
206
207
_ , err := prjRepository .Save (tC .existingProject )
207
208
assert .NoError (t , err )
208
209
}
209
- projectService , err := service .NewProjectsService (mlflowTrackingURL , prjRepository , nil , false , nil )
210
+ projectService , err := service .NewProjectsService (
211
+ mlflowTrackingURL , prjRepository , nil , false , nil ,
212
+ config.UpdateProjectConfig {},
213
+ )
210
214
assert .NoError (t , err )
211
215
212
216
appCtx := & AppContext {
@@ -316,7 +320,10 @@ func TestListProjects(t *testing.T) {
316
320
assert .NoError (t , err )
317
321
}
318
322
}
319
- projectService , err := service .NewProjectsService (mlflowTrackingURL , prjRepository , nil , false , nil )
323
+ projectService , err := service .NewProjectsService (
324
+ mlflowTrackingURL , prjRepository , nil , false , nil ,
325
+ config.UpdateProjectConfig {},
326
+ )
320
327
assert .NoError (t , err )
321
328
322
329
appCtx := & AppContext {
@@ -369,14 +376,62 @@ func TestListProjects(t *testing.T) {
369
376
370
377
func TestUpdateProject (t * testing.T ) {
371
378
testCases := []struct {
372
- desc string
373
- projectID models.ID
374
- existingProject * models.Project
375
- expectedResponse * Response
376
- body interface {}
379
+ desc string
380
+ projectID models.ID
381
+ existingProject * models.Project
382
+ expectedResponse * Response
383
+ body interface {}
384
+ updateProjectConfig config.UpdateProjectConfig
377
385
}{
378
386
{
379
- desc : "Should success" ,
387
+ desc : "Should success with update project config" ,
388
+ projectID : models .ID (1 ),
389
+ existingProject : & models.Project {
390
+ ID : models .ID (1 ),
391
+ Name : "Project1" ,
392
+ MLFlowTrackingURL : "http://mlflow.com" ,
393
+ Administrators : []string {adminUser },
394
+ Team : "dsp" ,
395
+ Stream : "dsp" ,
396
+ CreatedUpdated : models.CreatedUpdated {
397
+ CreatedAt : now ,
398
+ UpdatedAt : now ,
399
+ },
400
+ },
401
+ body : & models.Project {
402
+ Name : "Project1" ,
403
+ Team : "merlin" ,
404
+ Stream : "dsp" ,
405
+ Administrators : []string {adminUser },
406
+ },
407
+ expectedResponse : & Response {
408
+ code : 200 ,
409
+ data : map [string ]interface {}{
410
+ "status" : "success" ,
411
+ "message" : "Project updated successfully" ,
412
+ },
413
+ },
414
+ updateProjectConfig : config.UpdateProjectConfig {
415
+ Endpoint : "url" ,
416
+ PayloadTemplate : `{
417
+ "project": "{{.Name}}",
418
+ "administrators": "{{.Administrators}}",
419
+ "readers": "{{.Readers}}",
420
+ "team": "{{.Team}}",
421
+ "stream": "{{.Stream}}"
422
+ }` ,
423
+ ResponseTemplate : `{
424
+ "status": "{{.status}}",
425
+ "message": "{{.message}}"
426
+ }` ,
427
+ LabelsBlacklist : []string {
428
+ "label1" ,
429
+ "label2" ,
430
+ },
431
+ },
432
+ },
433
+ {
434
+ desc : "Should success without update project config" ,
380
435
projectID : models .ID (1 ),
381
436
existingProject : & models.Project {
382
437
ID : models .ID (1 ),
@@ -411,6 +466,7 @@ func TestUpdateProject(t *testing.T) {
411
466
},
412
467
},
413
468
},
469
+ updateProjectConfig : config.UpdateProjectConfig {},
414
470
},
415
471
{
416
472
desc : "Should failed when name is not specified" ,
@@ -438,6 +494,7 @@ func TestUpdateProject(t *testing.T) {
438
494
Message : "Name is required" ,
439
495
},
440
496
},
497
+ updateProjectConfig : config.UpdateProjectConfig {},
441
498
},
442
499
{
443
500
desc : "Should failed when name project id is not found" ,
@@ -466,6 +523,52 @@ func TestUpdateProject(t *testing.T) {
466
523
Message : "project with ID 2 not found" ,
467
524
},
468
525
},
526
+ updateProjectConfig : config.UpdateProjectConfig {},
527
+ },
528
+ {
529
+ desc : "Should fail when label in blacklist" ,
530
+ projectID : models .ID (1 ),
531
+ existingProject : & models.Project {
532
+ ID : models .ID (1 ),
533
+ Name : "Project1" ,
534
+ MLFlowTrackingURL : "http://mlflow.com" ,
535
+ Administrators : []string {adminUser },
536
+ Team : "dsp" ,
537
+ Stream : "dsp" ,
538
+ Labels : models.Labels {
539
+ {
540
+ Key : "my-label" ,
541
+ Value : "my-value" ,
542
+ },
543
+ },
544
+ CreatedUpdated : models.CreatedUpdated {
545
+ CreatedAt : now ,
546
+ UpdatedAt : now ,
547
+ },
548
+ },
549
+ body : & models.Project {
550
+ Name : "Project1" ,
551
+ Team : "merlin" ,
552
+ Stream : "dsp" ,
553
+ Labels : models.Labels {
554
+ {
555
+ Key : "my-label" ,
556
+ Value : "my-new-value" ,
557
+ },
558
+ },
559
+ Administrators : []string {adminUser },
560
+ },
561
+ expectedResponse : & Response {
562
+ code : 500 ,
563
+ data : ErrorMessage {
564
+ Message : "one or more labels are blacklisted or have been removed or changed values and cannot be updated" ,
565
+ },
566
+ },
567
+ updateProjectConfig : config.UpdateProjectConfig {
568
+ LabelsBlacklist : []string {
569
+ "my-label" ,
570
+ },
571
+ },
469
572
},
470
573
}
471
574
for _ , tC := range testCases {
@@ -476,7 +579,31 @@ func TestUpdateProject(t *testing.T) {
476
579
_ , err := prjRepository .Save (tC .existingProject )
477
580
assert .NoError (t , err )
478
581
}
479
- projectService , err := service .NewProjectsService (mlflowTrackingURL , prjRepository , nil , false , nil )
582
+
583
+ var server * httptest.Server
584
+ if tC .updateProjectConfig .Endpoint != "" {
585
+ server = httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
586
+ var payload map [string ]interface {}
587
+ err := json .NewDecoder (r .Body ).Decode (& payload )
588
+ assert .NoError (t , err )
589
+
590
+ w .WriteHeader (http .StatusOK )
591
+ response := map [string ]string {
592
+ "status" : "success" ,
593
+ "message" : "Project updated successfully" ,
594
+ }
595
+ err = json .NewEncoder (w ).Encode (response )
596
+ assert .NoError (t , err )
597
+ }))
598
+ defer server .Close ()
599
+
600
+ tC .updateProjectConfig .Endpoint = server .URL
601
+ }
602
+
603
+ projectService , err := service .NewProjectsService (
604
+ mlflowTrackingURL , prjRepository , nil , false , nil ,
605
+ tC .updateProjectConfig ,
606
+ )
480
607
assert .NoError (t , err )
481
608
482
609
appCtx := & AppContext {
@@ -506,14 +633,24 @@ func TestUpdateProject(t *testing.T) {
506
633
507
634
assert .Equal (t , tC .expectedResponse .code , rr .Code )
508
635
if tC .expectedResponse .code >= 200 && tC .expectedResponse .code < 300 {
509
- project := & models.Project {}
510
- err = json .Unmarshal (rr .Body .Bytes (), & project )
511
- assert .NoError (t , err )
636
+ switch tC .expectedResponse .data .(type ) {
637
+ case * models.Project :
638
+ project := & models.Project {}
639
+ err = json .Unmarshal (rr .Body .Bytes (), & project )
640
+ assert .NoError (t , err )
512
641
513
- project .CreatedAt = now
514
- project .UpdatedAt = now
642
+ project .CreatedAt = now
643
+ project .UpdatedAt = now
515
644
516
- assert .Equal (t , tC .expectedResponse .data , project )
645
+ assert .Equal (t , tC .expectedResponse .data , project )
646
+ case map [string ]interface {}:
647
+ var responseMessage map [string ]interface {}
648
+ err = json .Unmarshal (rr .Body .Bytes (), & responseMessage )
649
+ assert .NoError (t , err )
650
+ assert .Equal (t , tC .expectedResponse .data , responseMessage )
651
+ default :
652
+ t .Fatal ("unexpected type for expectedResponse.data" )
653
+ }
517
654
} else {
518
655
e := ErrorMessage {}
519
656
err = json .Unmarshal (rr .Body .Bytes (), & e )
@@ -595,7 +732,10 @@ func TestGetProject(t *testing.T) {
595
732
_ , err := prjRepository .Save (tC .existingProject )
596
733
assert .NoError (t , err )
597
734
}
598
- projectService , err := service .NewProjectsService (mlflowTrackingURL , prjRepository , nil , false , nil )
735
+ projectService , err := service .NewProjectsService (
736
+ mlflowTrackingURL , prjRepository , nil , false , nil ,
737
+ config.UpdateProjectConfig {},
738
+ )
599
739
assert .NoError (t , err )
600
740
601
741
appCtx := & AppContext {
0 commit comments