github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/pkg/cli/client/byoc/clouds/byoc_test.go (about) 1 package clouds 2 3 import ( 4 "testing" 5 6 compose "github.com/compose-spec/compose-go/v2/types" 7 "github.com/defang-io/defang/src/pkg/cli/client" 8 "github.com/defang-io/defang/src/pkg/types" 9 defangv1 "github.com/defang-io/defang/src/protos/io/defang/v1" 10 ) 11 12 func TestDomainMultipleProjectSupport(t *testing.T) { 13 port80 := &defangv1.Port{Mode: defangv1.Mode_INGRESS, Target: 80} 14 port8080 := &defangv1.Port{Mode: defangv1.Mode_INGRESS, Target: 8080} 15 hostModePort := &defangv1.Port{Mode: defangv1.Mode_HOST, Target: 80} 16 tests := []struct { 17 ProjectName string 18 TenantID types.TenantID 19 Fqn string 20 Port *defangv1.Port 21 EndPoint string 22 PublicFqdn string 23 PrivateFqdn string 24 }{ 25 {"", "tenant1", "web", port80, "web--80.example.com", "web.example.com", "web.tenant1.internal"}, 26 {"", "tenant1", "web", hostModePort, "web.tenant1.internal:80", "web.example.com", "web.tenant1.internal"}, 27 {"project1", "tenant1", "web", port80, "web--80.project1.example.com", "web.project1.example.com", "web.project1.internal"}, 28 {"Project1", "tenant1", "web", port80, "web--80.project1.example.com", "web.project1.example.com", "web.project1.internal"}, 29 {"project1", "tenant1", "web", hostModePort, "web.project1.internal:80", "web.project1.example.com", "web.project1.internal"}, 30 {"project1", "tenant1", "api", port8080, "api--8080.project1.example.com", "api.project1.example.com", "api.project1.internal"}, 31 {"tenant1", "tenant1", "web", port80, "web--80.example.com", "web.example.com", "web.tenant1.internal"}, 32 {"tenant1", "tenant1", "web", hostModePort, "web.tenant1.internal:80", "web.example.com", "web.tenant1.internal"}, 33 {"Project1", "tenant1", "web", port80, "web--80.project1.example.com", "web.project1.example.com", "web.project1.internal"}, 34 {"Tenant2", "tenant1", "web", port80, "web--80.tenant2.example.com", "web.tenant2.example.com", "web.tenant2.internal"}, 35 {"tenant1", "tenAnt1", "web", port80, "web--80.example.com", "web.example.com", "web.tenant1.internal"}, 36 } 37 38 for _, tt := range tests { 39 t.Run(tt.ProjectName+","+string(tt.TenantID), func(t *testing.T) { 40 b := NewByocAWS(tt.TenantID, &client.GrpcClient{Loader: FakeLoader{ProjectName: tt.ProjectName}}) 41 if _, err := b.LoadProject(); err != nil { 42 t.Fatalf("LoadCompose() failed: %v", err) 43 } 44 b.customDomain = b.getProjectDomain("example.com") 45 46 endpoint := b.getEndpoint(tt.Fqn, tt.Port) 47 if endpoint != tt.EndPoint { 48 t.Errorf("expected endpoint %q, got %q", tt.EndPoint, endpoint) 49 } 50 51 publicFqdn := b.getPublicFqdn(tt.Fqn) 52 if publicFqdn != tt.PublicFqdn { 53 t.Errorf("expected public fqdn %q, got %q", tt.PublicFqdn, publicFqdn) 54 } 55 56 privateFqdn := b.getPrivateFqdn(tt.Fqn) 57 if privateFqdn != tt.PrivateFqdn { 58 t.Errorf("expected private fqdn %q, got %q", tt.PrivateFqdn, privateFqdn) 59 } 60 }) 61 } 62 } 63 64 type FakeLoader struct { 65 ProjectName string 66 } 67 68 func (f FakeLoader) LoadWithDefaultProjectName(defaultName string) (*compose.Project, error) { 69 name := defaultName 70 if f.ProjectName != "" { 71 name = f.ProjectName 72 } 73 return &compose.Project{Name: name}, nil 74 } 75 76 func (f FakeLoader) LoadWithProjectName(projectName string) (*compose.Project, error) { 77 return &compose.Project{Name: projectName}, nil 78 }