github.com/cozy/cozy-stack@v0.0.0-20240327093429-939e4a21320e/model/instance/instance_test.go (about) 1 package instance_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/cozy/cozy-stack/model/instance" 8 "github.com/cozy/cozy-stack/pkg/config/config" 9 "github.com/cozy/cozy-stack/pkg/crypto" 10 jwt "github.com/golang-jwt/jwt/v5" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestInstance(t *testing.T) { 16 config.UseTestFile(t) 17 18 t.Run("Subdomain", func(t *testing.T) { 19 inst := &instance.Instance{ 20 Domain: "foo.example.com", 21 } 22 cfg := config.GetConfig() 23 was := cfg.Subdomains 24 defer func() { cfg.Subdomains = was }() 25 26 cfg.Subdomains = config.NestedSubdomains 27 u := inst.SubDomain("calendar") 28 assert.Equal(t, "https://calendar.foo.example.com/", u.String()) 29 30 cfg.Subdomains = config.FlatSubdomains 31 u = inst.SubDomain("calendar") 32 assert.Equal(t, "https://foo-calendar.example.com/", u.String()) 33 }) 34 35 t.Run("BuildAppToken", func(t *testing.T) { 36 inst := &instance.Instance{ 37 Domain: "test-ctx-token.example.com", 38 SessSecret: crypto.GenerateRandomBytes(64), 39 } 40 41 tokenString := inst.BuildAppToken("my-app", "sessionid") 42 token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { 43 _, ok := token.Method.(*jwt.SigningMethodHMAC) 44 assert.True(t, ok, "The signing method should be HMAC") 45 return inst.SessionSecret(), nil 46 }) 47 assert.NoError(t, err) 48 assert.True(t, token.Valid) 49 50 claims, ok := token.Claims.(jwt.MapClaims) 51 assert.True(t, ok, "Claims can be parsed as standard claims") 52 assert.Equal(t, []interface{}{"app"}, claims["aud"]) 53 assert.Equal(t, "test-ctx-token.example.com", claims["iss"]) 54 assert.Equal(t, "my-app", claims["sub"]) 55 }) 56 57 t.Run("GetContextWithSponsorships", func(t *testing.T) { 58 cfg := config.GetConfig() 59 was := cfg.Contexts 60 defer func() { cfg.Contexts = was }() 61 62 cfg.Contexts = map[string]interface{}{ 63 "context": map[string]interface{}{ 64 "manager_url": "http://manager.example.org", 65 "logos": map[string]interface{}{ 66 "coachco2": map[string]interface{}{ 67 "light": []interface{}{ 68 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud"}, 69 }, 70 }, 71 "home": map[string]interface{}{ 72 "light": []interface{}{ 73 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud", "type": "main"}, 74 map[string]interface{}{"src": "/logos/partner1.png", "alt": "Partner1", "type": "secondary"}, 75 }, 76 "dark": []interface{}{ 77 // no main 78 map[string]interface{}{"src": "/logos/partner1.png", "alt": "Partner1", "type": "secondary"}, 79 }, 80 }, 81 }, 82 }, 83 "sponsor1": map[string]interface{}{ 84 "move_url": "http://move.cozy.beta/", 85 "logos": map[string]interface{}{ 86 "coachco2": map[string]interface{}{ 87 "dark": []interface{}{ 88 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud"}, 89 }, 90 }, 91 "home": map[string]interface{}{ 92 "light": []interface{}{ 93 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud", "type": "main"}, 94 map[string]interface{}{"src": "/logos/partner1.png", "alt": "Partner1", "type": "secondary"}, 95 map[string]interface{}{"src": "/logos/partner2.png", "alt": "Partner2", "type": "secondary"}, 96 }, 97 "dark": []interface{}{ 98 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud", "type": "main"}, 99 map[string]interface{}{"src": "/logos/partner2.png", "alt": "Partner2"}, 100 map[string]interface{}{"src": "/logos/partner1.png", "alt": "Partner1"}, 101 }, 102 }, 103 }, 104 }, 105 "sponsor2": map[string]interface{}{ 106 "logos": map[string]interface{}{ 107 "mespapiers": map[string]interface{}{ 108 "dark": []interface{}{ 109 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud"}, 110 }, 111 }, 112 "home": map[string]interface{}{ 113 "light": []interface{}{ 114 map[string]interface{}{"src": "/logos/main_cozy.png", "alt": "Cozy Cloud", "type": "main"}, 115 map[string]interface{}{"src": "/logos/partner3.png", "alt": "Partner3", "type": "secondary"}, 116 map[string]interface{}{"src": "/logos/partner2.png", "alt": "Partner2", "type": "secondary"}, 117 }, 118 }, 119 }, 120 }, 121 } 122 123 inst := &instance.Instance{ 124 Domain: "foo.example.com", 125 ContextName: "context", 126 Sponsorships: []string{"sponsor1", "sponsor2"}, 127 } 128 result := inst.GetContextWithSponsorships() 129 bytes, err := json.MarshalIndent(result, "", " ") 130 require.NoError(t, err) 131 expected := `{ 132 "logos": { 133 "coachco2": { 134 "light": [ 135 { 136 "src": "/logos/main_cozy.png", 137 "alt": "Cozy Cloud" 138 } 139 ] 140 }, 141 "home": { 142 "light": [ 143 { 144 "src": "/logos/main_cozy.png", 145 "alt": "Cozy Cloud", 146 "type": "main" 147 }, 148 { 149 "src": "/logos/partner1.png", 150 "alt": "Partner1", 151 "type": "secondary" 152 }, 153 { 154 "src": "/ext/sponsor1/logos/partner2.png", 155 "alt": "Partner2", 156 "type": "secondary" 157 }, 158 { 159 "src": "/ext/sponsor2/logos/partner3.png", 160 "alt": "Partner3", 161 "type": "secondary" 162 } 163 ], 164 "dark": [ 165 { 166 "src": "/logos/partner1.png", 167 "alt": "Partner1", 168 "type": "secondary" 169 }, 170 { 171 "src": "/ext/sponsor1/logos/partner2.png", 172 "alt": "Partner2" 173 } 174 ] 175 } 176 }, 177 "manager_url": "http://manager.example.org" 178 }` 179 assert.Equal(t, expected, string(bytes)) 180 }) 181 }