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  }