import { describe, expect, it, vi } from 'vitest' import { SDK } from '../src/index.js' import { default as fetch, Response } from 'node-fetch' import { TenantModel, LibraryModel, AuthModel, QueryContext } from '../src/index.js' const auth0 = { isAuthenticated: true, isLoading: false, user: { 'https://auth.sitecorecloud.io/claims/tenant_id': '1', 'https://auth.sitecorecloud.io/claims/tenant_name': 'my-tenant-name-1', 'https://auth.sitecorecloud.io/claims/org_id': 'org1', 'https://auth.sitecorecloud.io/claims/org_name': 'organization', 'https://auth.sitecorecloud.io/claims/org_display_name': 'This is test Organization', 'https://auth.sitecorecloud.io/claims/org_type': 'internal', 'https://auth.sitecorecloud.io/claims/roles': ['[Global]\\Everyone', '[Organization]\\Organization Owner'], given_name: 'Test', family_name: 'test', name: 'Test test', picture: 'https://s.gravatar.com/avatar/89fbc125f0bbd0f7aff79f28cb0d6013?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fti.png', updated_at: '2023-03-09T13:25:15.527Z', email: 'test@test.com', email_verified: true, sub: 'auth0|123' }, loginWithRedirect: async ({ redirectUri, appState, fragment }: { redirectUri?: string appState?: any // eslint-disable-line @typescript-eslint/no-explicit-any fragment?: string }) => { return } } const query1 = { tenantName: 'my-tenant-name-1', organization: 'org1', systemId: 'system1' } const query2 = { tenantName: 'my-tenant-name-2', organization: 'org2', systemId: 'system2' } const tenant1 = new TenantModel({ serviceId: '', id: '1', systemId: 'system1', name: 'my-tenant-name-1', displayName: 'name', organizationId: 'org1', annotations: {}, labels: {} }) const library1 = new LibraryModel({ id: 'library1', name: 'library1', xmProjectId: '', apiKey: 'library1', organizationId: 'org1', templateId: 'template-default' }) const sdk = SDK.instance sdk.backend = 'http://localhost:5000/api' sdk.accessToken = 'abc' describe('Auth', () => { describe('login', () => { it('should login successfully', async () => { sdk.auth.set(auth0) sdk.auth.login(query1) }) it('should throw error when auth0 returns error in querystring', async () => { const query = { error: 'external error', error_description: 'external error description' } await expect(sdk.auth.login(query)).rejects.toEqual(new Error(query.error_description)) }) it('should re-login to different organization based on query param', async () => { //@ts-ignore vi.spyOn(sdk.tenants, 'search').mockImplementation(() => Promise.resolve([tenant1])) sdk.auth.set(auth0) sdk.auth.tenant = await sdk.auth.findTenant(query1, '8DB0AD22-445F-43FB-8D8E-F23C9396C974', 'libraryId') expect(await sdk.auth.login(query1)).toBe(false) expect(await sdk.auth.login(query2)).toBe(true) }) it('should re-login to different organization based on user tenant ', async () => { //@ts-ignore vi.spyOn(sdk.tenants, 'search').mockImplementation(() => Promise.resolve([tenant1])) sdk.auth.set(auth0) sdk.auth.user['https://auth.sitecorecloud.io/claims/org_id'] = 'org1' sdk.auth.tenant = await sdk.auth.findTenant(query1, '8DB0AD22-445F-43FB-8D8E-F23C9396C974', 'libraryId') expect(await sdk.auth.login({})).toBe(false) }) }) describe('tenant validation', () => { it('should load correct tenant', async () => { //@ts-ignore vi.spyOn(sdk.tenants, 'search').mockImplementation(() => Promise.resolve([tenant1])) sdk.auth.set(auth0) const tenant = await sdk.auth.findTenant(query1, '8DB0AD22-445F-43FB-8D8E-F23C9396C974', 'libraryId') expect(tenant).toBe(tenant1) }) it('error on user having no tenants', async () => { //@ts-ignore vi.spyOn(sdk.tenants, 'search').mockImplementation(() => Promise.resolve([])) sdk.auth.set(auth0) await expect(sdk.auth.findTenant(query1, '8DB0AD22-445F-43FB-8D8E-F23C9396C974', 'libraryId')).rejects.toEqual( new Error('User does not have access to any components libraries') ) }) }) describe('library validation', () => { it('generates context taking care of undefined values', () => { const query: QueryContext = { organization: 'org1', tenantName: undefined } expect(AuthModel.getContextFromQuery(query)).toStrictEqual({ organization: 'org1', tenantName: undefined }) AuthModel.setLocalStorageContext({ systemId: 'sys1', tenantName: undefined }) expect(AuthModel.getContextFromLocalStorage()).toStrictEqual({ systemId: 'sys1' }) sdk.auth.tenant.systemId = undefined expect(sdk.auth.getContext(query)).toStrictEqual({ tenantName: undefined, organization: 'org1', systemId: 'sys1' }) expect(AuthModel.formatContextForAuth0(sdk.auth.getContext(query))).toStrictEqual({ tenant_name: undefined, organization_id: 'org1', system_id: 'sys1' }) query.organization = undefined expect(sdk.auth.getContext(query)).toStrictEqual({ tenantName: 'my-tenant-name-1', organization: 'org1', systemId: 'sys1' }) expect(AuthModel.formatContextForAuth0(sdk.auth.getContext(query))).toStrictEqual({ tenant_name: 'my-tenant-name-1', organization_id: 'org1', system_id: 'sys1' }) }) }) })