From 0e78b4e9b7da364abcc5b7b1d65f5ffa4a0ed115 Mon Sep 17 00:00:00 2001 From: ryanbas21 Date: Wed, 13 Nov 2024 11:42:20 -0700 Subject: [PATCH] fix(davinci-client): fix-trailing-slash if a trailing slash is not provided in the base-url, we should append one. --- .../src/lib/config.slice.test.ts | 124 ++++++++++++++++++ .../davinci-client/src/lib/config.slice.ts | 17 ++- 2 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 packages/davinci-client/src/lib/config.slice.test.ts diff --git a/packages/davinci-client/src/lib/config.slice.test.ts b/packages/davinci-client/src/lib/config.slice.test.ts new file mode 100644 index 000000000..dde81d4fc --- /dev/null +++ b/packages/davinci-client/src/lib/config.slice.test.ts @@ -0,0 +1,124 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { describe, it, expect } from 'vitest'; +import type { DaVinciConfig } from './config.types.js'; + +// Assuming the initialState is as follows: +const initialState = { + clientId: '', + redirectUri: '', + responseType: '', + scope: '', + serverConfig: { + baseUrl: '', + }, +}; + +export const configSlice = createSlice({ + name: 'config', + initialState, + reducers: { + set(state, action: PayloadAction) { + state.clientId = action.payload.clientId || ''; + state.redirectUri = action.payload.redirectUri || `${location.origin}/handle-redirect`; + state.responseType = action.payload.responseType || 'code'; + state.scope = action.payload.scope || 'openid'; + + if (!action.payload.serverConfig?.baseUrl) { + state.serverConfig = { + baseUrl: '', + }; + } else if (action.payload.serverConfig?.baseUrl.endsWith('/')) { + state.serverConfig = { + baseUrl: action.payload.serverConfig?.baseUrl, + }; + } else { + state.serverConfig = { + baseUrl: action.payload.serverConfig?.baseUrl.concat('/'), + }; + } + }, + }, +}); + +describe('configSlice', () => { + const { set } = configSlice.actions; + + it('should set the configuration correctly with a complete action', () => { + const action = set({ + clientId: 'test-client-id', + redirectUri: 'http://example.com/redirect', + responseType: 'token', + scope: 'profile', + serverConfig: { + baseUrl: 'http://server.com/api', + }, + }); + + const expectedState = { + clientId: 'test-client-id', + redirectUri: 'http://example.com/redirect', + responseType: 'token', + scope: 'profile', + serverConfig: { + baseUrl: 'http://server.com/api/', + }, + }; + + expect(configSlice.reducer(initialState, action)).toEqual(expectedState); + }); + + it('should use default values when no values are provided', () => { + const action = set({}); + const expectedState = { + clientId: '', + redirectUri: `${location.origin}/handle-redirect`, + responseType: 'code', + scope: 'openid', + serverConfig: { + baseUrl: '', + }, + }; + + expect(configSlice.reducer(initialState, action)).toEqual(expectedState); + }); + + it('should set serverConfig baseUrl correctly when baseUrl does not end with a slash', () => { + const action = set({ + serverConfig: { + baseUrl: 'http://server.com/am', + }, + }); + + const expectedState = { + clientId: '', + redirectUri: `${location.origin}/handle-redirect`, + responseType: 'code', + scope: 'openid', + serverConfig: { + baseUrl: 'http://server.com/am/', + }, + }; + + expect(configSlice.reducer(initialState, action)).toEqual(expectedState); + }); + + it('should set serverConfig baseUrl correctly when baseUrl ends with a slash', () => { + const action = set({ + serverConfig: { + baseUrl: 'http://server.com/am/', + }, + }); + + const expectedState = { + clientId: '', + redirectUri: `${location.origin}/handle-redirect`, + responseType: 'code', + scope: 'openid', + serverConfig: { + baseUrl: 'http://server.com/am/', + }, + }; + + expect(configSlice.reducer(initialState, action)).toEqual(expectedState); + }); +}); diff --git a/packages/davinci-client/src/lib/config.slice.ts b/packages/davinci-client/src/lib/config.slice.ts index 5da74c1b2..115012ea4 100644 --- a/packages/davinci-client/src/lib/config.slice.ts +++ b/packages/davinci-client/src/lib/config.slice.ts @@ -42,9 +42,20 @@ export const configSlice = createSlice({ state.redirectUri = action.payload.redirectUri || `${location.origin}/handle-redirect`; state.responseType = action.payload.responseType || 'code'; state.scope = action.payload.scope || 'openid'; - state.serverConfig = { - baseUrl: action.payload.serverConfig?.baseUrl || '', - }; + + if (!action.payload.serverConfig?.baseUrl) { + state.serverConfig = { + baseUrl: '', + }; + } else if (action.payload.serverConfig?.baseUrl.endsWith('/')) { + state.serverConfig = { + baseUrl: action.payload.serverConfig?.baseUrl, + }; + } else { + state.serverConfig = { + baseUrl: action.payload.serverConfig?.baseUrl.concat('/'), + }; + } }, }, });