@@ -53,6 +53,66 @@ func TestApplicationURLString(t *testing.T) {
53
53
},
54
54
Expected :"yolo---app--agent--workspace--user" ,
55
55
},
56
+ {
57
+ Name :"5DigitAppSlug" ,
58
+ URL : appurl.ApplicationURL {
59
+ AppSlugOrPort :"30000" ,
60
+ AgentName :"" ,
61
+ WorkspaceName :"workspace" ,
62
+ Username :"user" ,
63
+ },
64
+ Expected :"30000--workspace--user" ,
65
+ },
66
+ {
67
+ Name :"4DigitPort" ,
68
+ URL : appurl.ApplicationURL {
69
+ AppSlugOrPort :"1234" ,
70
+ AgentName :"agent" ,
71
+ WorkspaceName :"workspace" ,
72
+ Username :"user" ,
73
+ },
74
+ Expected :"1234--agent--workspace--user" ,
75
+ },
76
+ {
77
+ Name :"3DigitPort" ,
78
+ URL : appurl.ApplicationURL {
79
+ AppSlugOrPort :"123" ,
80
+ AgentName :"" ,
81
+ WorkspaceName :"workspace" ,
82
+ Username :"user" ,
83
+ },
84
+ Expected :"123--workspace--user" ,
85
+ },
86
+ {
87
+ Name :"LegacyAppSlug_WithAgent_StillWorks" ,
88
+ URL : appurl.ApplicationURL {
89
+ AppSlugOrPort :"myapp" ,
90
+ AgentName :"agent" ,
91
+ WorkspaceName :"workspace" ,
92
+ Username :"user" ,
93
+ },
94
+ Expected :"myapp--agent--workspace--user" ,
95
+ },
96
+ {
97
+ Name :"AppSlug_WithNumbers" ,
98
+ URL : appurl.ApplicationURL {
99
+ AppSlugOrPort :"app123" ,
100
+ AgentName :"" ,
101
+ WorkspaceName :"workspace" ,
102
+ Username :"user" ,
103
+ },
104
+ Expected :"app123--workspace--user" ,
105
+ },
106
+ {
107
+ Name :"NumbersWithLetters" ,
108
+ URL : appurl.ApplicationURL {
109
+ AppSlugOrPort :"8080abc" ,
110
+ AgentName :"" ,
111
+ WorkspaceName :"workspace" ,
112
+ Username :"user" ,
113
+ },
114
+ Expected :"8080abc--workspace--user" ,
115
+ },
56
116
}
57
117
58
118
for _ ,c := range testCases {
@@ -164,6 +224,48 @@ func TestParseSubdomainAppURL(t *testing.T) {
164
224
Username :"user" ,
165
225
},
166
226
},
227
+ {
228
+ Name :"5DigitAppSlug--Workspace--User" ,
229
+ Subdomain :"30000--workspace--user" ,
230
+ Expected : appurl.ApplicationURL {
231
+ AppSlugOrPort :"30000" ,
232
+ AgentName :"" ,
233
+ WorkspaceName :"workspace" ,
234
+ Username :"user" ,
235
+ },
236
+ },
237
+ {
238
+ Name :"Invalid_4DigitPort--Workspace--User" ,
239
+ Subdomain :"1234--workspace--user" ,
240
+ Expected : appurl.ApplicationURL {},
241
+ ExpectedError :"agent name is required for port-based URLs" ,
242
+ },
243
+ {
244
+ Name :"3DigitPort_WithoutAgent" ,
245
+ Subdomain :"123--workspace--user" ,
246
+ Expected : appurl.ApplicationURL {
247
+ AppSlugOrPort :"123" ,
248
+ AgentName :"" ,
249
+ WorkspaceName :"workspace" ,
250
+ Username :"user" ,
251
+ },
252
+ },
253
+ {
254
+ Name :"Invalid_4DigitPortS_WithoutAgent" ,
255
+ Subdomain :"8080s--workspace--user" ,
256
+ Expected : appurl.ApplicationURL {},
257
+ ExpectedError :"agent name is required for port-based URLs" ,
258
+ },
259
+ {
260
+ Name :"ParseLegacyAppSlug_WithAgent" ,
261
+ Subdomain :"myapp--agent--workspace--user" ,
262
+ Expected : appurl.ApplicationURL {
263
+ AppSlugOrPort :"myapp" ,
264
+ AgentName :"" ,
265
+ WorkspaceName :"workspace" ,
266
+ Username :"user" ,
267
+ },
268
+ },
167
269
}
168
270
169
271
for _ ,c := range testCases {
@@ -471,3 +573,52 @@ func TestConvertAppURLForCSP(t *testing.T) {
471
573
})
472
574
}
473
575
}
576
+
577
+ func TestURLGenerationVsParsing (t * testing.T ) {
578
+ t .Parallel ()
579
+
580
+ testCases := []struct {
581
+ Name string
582
+ AppSlugOrPort string
583
+ AgentName string
584
+ ExpectedParsed string
585
+ }{
586
+ {
587
+ Name :"AppSlug_AgentOmittedInParsing" ,
588
+ AppSlugOrPort :"myapp" ,
589
+ AgentName :"agent" ,
590
+ ExpectedParsed :"" ,
591
+ },
592
+ {
593
+ Name :"4DigitPort_AgentPreserved" ,
594
+ AppSlugOrPort :"8080" ,
595
+ AgentName :"agent" ,
596
+ ExpectedParsed :"agent" ,
597
+ },
598
+ {
599
+ Name :"5DigitAppSlug_AgentOmittedInParsing" ,
600
+ AppSlugOrPort :"30000" ,
601
+ AgentName :"agent" ,
602
+ ExpectedParsed :"" ,
603
+ },
604
+ }
605
+
606
+ for _ ,tc := range testCases {
607
+ t .Run (tc .Name ,func (t * testing.T ) {
608
+ t .Parallel ()
609
+ original := appurl.ApplicationURL {
610
+ AppSlugOrPort :tc .AppSlugOrPort ,
611
+ AgentName :tc .AgentName ,
612
+ WorkspaceName :"workspace" ,
613
+ Username :"user" ,
614
+ }
615
+
616
+ urlString := original .String ()
617
+ parsed ,err := appurl .ParseSubdomainAppURL (urlString )
618
+ require .NoError (t ,err )
619
+
620
+ require .Equal (t ,tc .ExpectedParsed ,parsed .AgentName ,
621
+ "Agent name should be '%s' after parsing" ,tc .ExpectedParsed )
622
+ })
623
+ }
624
+ }