diff --git a/CHANGELOG.md b/CHANGELOG.md index 939fdd18e..93954f2b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Change history for stripes-core -## 10.0.0 IN PROGRESS +## 10.1.0 IN PROGRESS + +* Provide optional tenant argument to `useOkapiKy` hook. Refs STCOR-747. +* Avoid private path when import `validateUser` function. Refs STCOR-749. + +## [10.0.0](https://github.com/folio-org/stripes-core/tree/v10.0.0) (2023-10-11) +[Full Changelog](https://github.com/folio-org/stripes-core/compare/v9.0.0...v10.0.0) * Close app-context menu when its wrapper is undefined, which it will be when switching among apps. Fixes STCOR-680. * Move `miragejs` to dev-deps; remove `clean` script and `rimraf`. Refs STCOR-668, STCOR-681. diff --git a/index.js b/index.js index ed599f10d..f9598cb04 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,7 @@ export { useModules } from './src/ModulesContext'; export { withModule, withModules } from './src/components/Modules'; export { default as stripesConnect } from './src/stripesConnect'; export { default as Pluggable } from './src/Pluggable'; -export { updateUser, updateTenant } from './src/loginServices'; +export { updateUser, updateTenant, validateUser } from './src/loginServices'; export { default as coreEvents } from './src/events'; export { default as useOkapiKy } from './src/useOkapiKy'; export { default as withOkapiKy } from './src/withOkapiKy'; diff --git a/package.json b/package.json index 861a04084..36631f51c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@folio/stripes-core", - "version": "10.0.0", + "version": "10.1.0", "description": "The starting point for Stripes applications", "license": "Apache-2.0", "repository": "folio-org/stripes-core", diff --git a/src/useOkapiKy.js b/src/useOkapiKy.js index db39ff47c..969b57c4e 100644 --- a/src/useOkapiKy.js +++ b/src/useOkapiKy.js @@ -1,8 +1,8 @@ import ky from 'ky'; import { useStripes } from './StripesContext'; -export default () => { - const { locale = 'en', tenant, timeout = 30000, url } = useStripes().okapi; +export default ({ tenant } = {}) => { + const { locale = 'en', timeout = 30000, tenant: currentTenant, url } = useStripes().okapi; return ky.create({ credentials: 'include', @@ -10,7 +10,7 @@ export default () => { beforeRequest: [ request => { request.headers.set('Accept-Language', locale); - request.headers.set('X-Okapi-Tenant', tenant); + request.headers.set('X-Okapi-Tenant', tenant ?? currentTenant); } ] }, diff --git a/src/useOkapiKy.test.js b/src/useOkapiKy.test.js new file mode 100644 index 000000000..1a58e3208 --- /dev/null +++ b/src/useOkapiKy.test.js @@ -0,0 +1,86 @@ +import ky from 'ky'; +import { renderHook, waitFor } from '@folio/jest-config-stripes/testing-library/react'; + +import { useStripes } from './StripesContext'; +import useOkapiKy from './useOkapiKy'; + +jest.mock('./StripesContext'); +jest.mock('ky', () => ({ + create: ({ ...av }) => av, +})); + +describe('useOkapiKy', () => { + it('pulls values from stripes object', async () => { + const okapi = { + locale: 'klingon', + tenant: 'tenant', + timeout: 271828, + token: 'token', + url: 'https://whatever.com' + }; + + const mockUseStripes = useStripes; + mockUseStripes.mockReturnValue({ okapi }); + + const r = { + headers: { + set: jest.fn(), + } + }; + + const { result } = renderHook(() => useOkapiKy()); + result.current.hooks.beforeRequest[0](r); + + expect(result.current.prefixUrl).toBe(okapi.url); + expect(result.current.timeout).toBe(okapi.timeout); + + expect(r.headers.set).toHaveBeenCalledWith('Accept-Language', okapi.locale); + expect(r.headers.set).toHaveBeenCalledWith('X-Okapi-Tenant', okapi.tenant); + expect(r.headers.set).toHaveBeenCalledWith('X-Okapi-Token', okapi.token); + }); + + it('provides default values if stripes lacks them', async () => { + const okapi = {}; + + const mockUseStripes = useStripes; + mockUseStripes.mockReturnValue({ okapi }); + + const r = { + headers: { + set: jest.fn(), + } + }; + + const { result } = renderHook(() => useOkapiKy()); + result.current.hooks.beforeRequest[0](r); + + expect(result.current.timeout).toBe(30000); + + expect(r.headers.set).toHaveBeenCalledWith('Accept-Language', 'en'); + }); + + it('overrides tenant', async () => { + const okapi = { + tenant: 'tenant', + timeout: 271828, + token: 'token', + url: 'https://whatever.com' + }; + + const mockUseStripes = useStripes; + mockUseStripes.mockReturnValue({ okapi }); + + const r = { + headers: { + set: jest.fn(), + } + }; + + const { result } = renderHook(() => useOkapiKy({ tenant: 'monkey' })); + result.current.hooks.beforeRequest[0](r); + + expect(r.headers.set).toHaveBeenCalledWith('X-Okapi-Tenant', 'monkey'); + }); +}); + +