github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/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  }