@looker/api-explorer 0.9.26 → 0.9.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -1
- package/e2e/e2e.spec.ts +1 -1
- package/lib/ApiExplorer.d.ts +2 -6
- package/lib/ApiExplorer.js +53 -74
- package/lib/ApiExplorer.js.map +1 -1
- package/lib/StandaloneApiExplorer.js +35 -47
- package/lib/StandaloneApiExplorer.js.map +1 -1
- package/lib/components/Banner/Banner.d.ts +8 -0
- package/lib/components/Banner/Banner.js +70 -0
- package/lib/components/Banner/Banner.js.map +1 -0
- package/lib/components/Banner/index.d.ts +1 -0
- package/lib/components/Banner/index.js +14 -0
- package/lib/components/Banner/index.js.map +1 -0
- package/lib/components/DocPseudo/DocParam.js +3 -1
- package/lib/components/DocPseudo/DocParam.js.map +1 -1
- package/lib/components/DocSDKs/DocSDKs.js +3 -3
- package/lib/components/DocSDKs/DocSDKs.js.map +1 -1
- package/lib/components/ExploreType/ExploreType.js +3 -5
- package/lib/components/ExploreType/ExploreType.js.map +1 -1
- package/lib/components/Header/Header.d.ts +2 -5
- package/lib/components/Header/Header.js +1 -5
- package/lib/components/Header/Header.js.map +1 -1
- package/lib/components/SelectorContainer/ApiSpecSelector.d.ts +2 -5
- package/lib/components/SelectorContainer/ApiSpecSelector.js +5 -5
- package/lib/components/SelectorContainer/ApiSpecSelector.js.map +1 -1
- package/lib/components/SelectorContainer/SelectorContainer.d.ts +2 -5
- package/lib/components/SelectorContainer/SelectorContainer.js +3 -7
- package/lib/components/SelectorContainer/SelectorContainer.js.map +1 -1
- package/lib/components/SideNav/SideNav.d.ts +2 -5
- package/lib/components/SideNav/SideNav.js.map +1 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +8 -0
- package/lib/components/index.js.map +1 -1
- package/lib/esm/ApiExplorer.js +54 -74
- package/lib/esm/ApiExplorer.js.map +1 -1
- package/lib/esm/StandaloneApiExplorer.js +34 -48
- package/lib/esm/StandaloneApiExplorer.js.map +1 -1
- package/lib/esm/components/Banner/Banner.js +54 -0
- package/lib/esm/components/Banner/Banner.js.map +1 -0
- package/lib/esm/components/Banner/index.js +2 -0
- package/lib/esm/components/Banner/index.js.map +1 -0
- package/lib/esm/components/DocPseudo/DocParam.js +2 -1
- package/lib/esm/components/DocPseudo/DocParam.js.map +1 -1
- package/lib/esm/components/DocSDKs/DocSDKs.js +2 -2
- package/lib/esm/components/DocSDKs/DocSDKs.js.map +1 -1
- package/lib/esm/components/ExploreType/ExploreType.js +3 -4
- package/lib/esm/components/ExploreType/ExploreType.js.map +1 -1
- package/lib/esm/components/Header/Header.js +1 -5
- package/lib/esm/components/Header/Header.js.map +1 -1
- package/lib/esm/components/SelectorContainer/ApiSpecSelector.js +4 -5
- package/lib/esm/components/SelectorContainer/ApiSpecSelector.js.map +1 -1
- package/lib/esm/components/SelectorContainer/SelectorContainer.js +3 -7
- package/lib/esm/components/SelectorContainer/SelectorContainer.js.map +1 -1
- package/lib/esm/components/SideNav/SideNav.js.map +1 -1
- package/lib/esm/components/index.js +1 -0
- package/lib/esm/components/index.js.map +1 -1
- package/lib/esm/index.js +1 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/routes/AppRouter.js +3 -7
- package/lib/esm/routes/AppRouter.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DiffScene.js +43 -99
- package/lib/esm/scenes/DiffScene/DiffScene.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DocDiff/DiffItem.js +9 -13
- package/lib/esm/scenes/DiffScene/DocDiff/DiffItem.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DocDiff/DocDiff.js +2 -2
- package/lib/esm/scenes/DiffScene/DocDiff/DocDiff.js.map +1 -1
- package/lib/esm/scenes/MethodScene/MethodScene.js +4 -5
- package/lib/esm/scenes/MethodScene/MethodScene.js.map +1 -1
- package/lib/esm/state/index.js +1 -0
- package/lib/esm/state/index.js.map +1 -1
- package/lib/esm/state/specs/index.js +3 -0
- package/lib/esm/state/specs/index.js.map +1 -0
- package/lib/esm/state/specs/sagas.js +58 -0
- package/lib/esm/state/specs/sagas.js.map +1 -0
- package/lib/esm/state/specs/selectors.js +8 -0
- package/lib/esm/state/specs/selectors.js.map +1 -0
- package/lib/esm/state/specs/slice.js +55 -0
- package/lib/esm/state/specs/slice.js.map +1 -0
- package/lib/esm/state/store.js +53 -2
- package/lib/esm/state/store.js.map +1 -1
- package/lib/esm/test-utils/redux.js +9 -5
- package/lib/esm/test-utils/redux.js.map +1 -1
- package/lib/esm/utils/adaptorUtils.js +101 -0
- package/lib/esm/utils/adaptorUtils.js.map +1 -0
- package/lib/esm/utils/apixAdaptor.js +48 -0
- package/lib/esm/utils/apixAdaptor.js.map +1 -0
- package/lib/esm/utils/index.js +3 -1
- package/lib/esm/utils/index.js.map +1 -1
- package/lib/esm/utils/path.js +27 -2
- package/lib/esm/utils/path.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -1
- package/lib/routes/AppRouter.d.ts +1 -5
- package/lib/routes/AppRouter.js +3 -7
- package/lib/routes/AppRouter.js.map +1 -1
- package/lib/scenes/DiffScene/DiffScene.js +45 -100
- package/lib/scenes/DiffScene/DiffScene.js.map +1 -1
- package/lib/scenes/DiffScene/DocDiff/DiffItem.js +9 -13
- package/lib/scenes/DiffScene/DocDiff/DiffItem.js.map +1 -1
- package/lib/scenes/DiffScene/DocDiff/DocDiff.js +2 -2
- package/lib/scenes/DiffScene/DocDiff/DocDiff.js.map +1 -1
- package/lib/scenes/MethodScene/MethodScene.d.ts +0 -4
- package/lib/scenes/MethodScene/MethodScene.js +5 -5
- package/lib/scenes/MethodScene/MethodScene.js.map +1 -1
- package/lib/state/index.d.ts +1 -0
- package/lib/state/index.js +13 -0
- package/lib/state/index.js.map +1 -1
- package/lib/state/settings/selectors.d.ts +1 -1
- package/lib/state/settings/slice.d.ts +1 -1
- package/lib/state/specs/index.d.ts +2 -0
- package/lib/state/specs/index.js +32 -0
- package/lib/state/specs/index.js.map +1 -0
- package/lib/state/specs/sagas.d.ts +1 -0
- package/lib/state/specs/sagas.js +67 -0
- package/lib/state/specs/sagas.js.map +1 -0
- package/lib/state/specs/selectors.d.ts +4 -0
- package/lib/state/specs/selectors.js +20 -0
- package/lib/state/specs/selectors.js.map +1 -0
- package/lib/state/specs/slice.d.ts +49 -0
- package/lib/state/specs/slice.js +70 -0
- package/lib/state/specs/slice.js.map +1 -0
- package/lib/state/store.d.ts +3 -0
- package/lib/state/store.js +56 -2
- package/lib/state/store.js.map +1 -1
- package/lib/test-data/declarations.d.ts +2 -0
- package/lib/test-data/examples.d.ts +2 -0
- package/lib/test-data/index.d.ts +3 -0
- package/lib/test-data/index.js +12 -42
- package/lib/test-data/index.js.map +1 -1
- package/lib/test-data/specs.d.ts +10 -0
- package/lib/test-data/specs.js +6 -6
- package/lib/test-data/specs.js.map +1 -1
- package/lib/test-utils/redux.d.ts +2 -1
- package/lib/test-utils/redux.js +9 -4
- package/lib/test-utils/redux.js.map +1 -1
- package/lib/utils/adaptorUtils.d.ts +30 -0
- package/lib/utils/adaptorUtils.js +124 -0
- package/lib/utils/adaptorUtils.js.map +1 -0
- package/lib/utils/apixAdaptor.d.ts +15 -0
- package/lib/utils/apixAdaptor.js +67 -0
- package/lib/utils/apixAdaptor.js.map +1 -0
- package/lib/utils/index.d.ts +3 -1
- package/lib/utils/index.js +45 -30
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/path.d.ts +3 -0
- package/lib/utils/path.js +32 -2
- package/lib/utils/path.js.map +1 -1
- package/package.json +10 -10
- package/src/ApiExplorer.tsx +47 -74
- package/src/StandaloneApiExplorer.tsx +37 -52
- package/src/components/Banner/Banner.spec.tsx +99 -0
- package/src/components/Banner/Banner.tsx +87 -0
- package/src/{reducers → components/Banner}/index.ts +1 -1
- package/src/components/DocPseudo/DocParam.spec.tsx +2 -1
- package/src/components/DocPseudo/DocParam.tsx +2 -1
- package/src/components/DocSDKs/DocSDKs.tsx +4 -5
- package/src/components/ExploreType/ExploreType.spec.tsx +0 -23
- package/src/components/ExploreType/ExploreType.tsx +5 -6
- package/src/components/ExploreType/exploreUtils.spec.tsx +1 -1
- package/src/components/Header/Header.spec.tsx +9 -30
- package/src/components/Header/Header.tsx +3 -10
- package/src/components/SelectorContainer/ApiSpecSelector.spec.tsx +31 -44
- package/src/components/SelectorContainer/ApiSpecSelector.tsx +6 -12
- package/src/components/SelectorContainer/SelectorContainer.spec.tsx +7 -26
- package/src/components/SelectorContainer/SelectorContainer.tsx +4 -10
- package/src/components/SideNav/SideNav.spec.tsx +12 -45
- package/src/components/SideNav/SideNav.tsx +1 -7
- package/src/components/index.ts +1 -0
- package/src/index.ts +1 -0
- package/src/routes/AppRouter.tsx +25 -37
- package/src/scenes/DiffScene/DiffScene.tsx +47 -84
- package/src/scenes/DiffScene/DocDiff/DiffItem.spec.tsx +9 -16
- package/src/scenes/DiffScene/DocDiff/DiffItem.tsx +11 -12
- package/src/scenes/DiffScene/DocDiff/DocDiff.tsx +2 -2
- package/src/scenes/MethodScene/MethodScene.tsx +4 -10
- package/src/state/index.ts +1 -0
- package/src/{reducers/spec → state/specs}/index.ts +2 -3
- package/src/state/specs/sagas.spec.ts +135 -0
- package/src/state/specs/sagas.ts +81 -0
- package/src/{reducers/spec/actions.spec.ts → state/specs/selectors.ts} +12 -11
- package/src/state/specs/slice.ts +109 -0
- package/src/state/store.ts +58 -0
- package/src/test-data/index.ts +1 -8
- package/src/test-data/specs.ts +6 -6
- package/src/test-utils/redux.tsx +15 -4
- package/src/utils/adaptorUtils.ts +181 -0
- package/src/utils/apixAdaptor.ts +72 -0
- package/src/utils/index.ts +3 -7
- package/src/utils/path.ts +25 -2
- package/lib/esm/reducers/index.js +0 -2
- package/lib/esm/reducers/index.js.map +0 -1
- package/lib/esm/reducers/spec/actions.js +0 -19
- package/lib/esm/reducers/spec/actions.js.map +0 -1
- package/lib/esm/reducers/spec/index.js +0 -4
- package/lib/esm/reducers/spec/index.js.map +0 -1
- package/lib/esm/reducers/spec/reducer.js +0 -62
- package/lib/esm/reducers/spec/reducer.js.map +0 -1
- package/lib/esm/reducers/spec/utils.js +0 -74
- package/lib/esm/reducers/spec/utils.js.map +0 -1
- package/lib/reducers/index.d.ts +0 -1
- package/lib/reducers/index.js +0 -19
- package/lib/reducers/index.js.map +0 -1
- package/lib/reducers/spec/actions.d.ts +0 -20
- package/lib/reducers/spec/actions.js +0 -31
- package/lib/reducers/spec/actions.js.map +0 -1
- package/lib/reducers/spec/index.d.ts +0 -3
- package/lib/reducers/spec/index.js +0 -45
- package/lib/reducers/spec/index.js.map +0 -1
- package/lib/reducers/spec/reducer.d.ts +0 -7
- package/lib/reducers/spec/reducer.js +0 -73
- package/lib/reducers/spec/reducer.js.map +0 -1
- package/lib/reducers/spec/utils.d.ts +0 -7
- package/lib/reducers/spec/utils.js +0 -91
- package/lib/reducers/spec/utils.js.map +0 -1
- package/src/reducers/spec/actions.ts +0 -62
- package/src/reducers/spec/reducer.spec.ts +0 -44
- package/src/reducers/spec/reducer.ts +0 -69
- package/src/reducers/spec/utils.spec.ts +0 -138
- package/src/reducers/spec/utils.ts +0 -123
|
@@ -24,16 +24,16 @@
|
|
|
24
24
|
|
|
25
25
|
*/
|
|
26
26
|
import React from 'react'
|
|
27
|
-
import {
|
|
28
|
-
import { renderWithTheme } from '@looker/components-test-utils'
|
|
27
|
+
import { screen, waitFor } from '@testing-library/react'
|
|
29
28
|
import userEvent from '@testing-library/user-event'
|
|
30
|
-
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
29
|
+
import { useHistory } from 'react-router-dom'
|
|
30
|
+
import { getLoadedSpecs, specs } from '../../test-data'
|
|
31
|
+
import {
|
|
32
|
+
renderWithReduxProvider,
|
|
33
|
+
renderWithRouterAndReduxProvider,
|
|
34
|
+
} from '../../test-utils'
|
|
33
35
|
import { ApiSpecSelector } from './ApiSpecSelector'
|
|
34
36
|
|
|
35
|
-
const specState = getLoadedSpecState()
|
|
36
|
-
|
|
37
37
|
jest.mock('react-router-dom', () => {
|
|
38
38
|
const ReactRouterDOM = jest.requireActual('react-router-dom')
|
|
39
39
|
return {
|
|
@@ -41,34 +41,29 @@ jest.mock('react-router-dom', () => {
|
|
|
41
41
|
useLocation: () => ({
|
|
42
42
|
pathname: '/4.0/methods/Dashboard/dashboard',
|
|
43
43
|
}),
|
|
44
|
+
useHistory: jest.fn().mockReturnValue({ push: jest.fn() }),
|
|
44
45
|
}
|
|
45
46
|
})
|
|
46
47
|
|
|
48
|
+
// jest.mock('../../state/specs', () => ({
|
|
49
|
+
// ...(jest.requireActual('../../state/specs') as Record<string, unknown>),
|
|
50
|
+
// useSpecActions: jest
|
|
51
|
+
// .fn()
|
|
52
|
+
// .mockReturnValue({ setCurrentSpecAction: jest.fn() }),
|
|
53
|
+
// }))
|
|
54
|
+
|
|
47
55
|
describe('ApiSpecSelector', () => {
|
|
48
|
-
const specDispatch = jest.fn()
|
|
49
56
|
Element.prototype.scrollIntoView = jest.fn()
|
|
57
|
+
const spec = getLoadedSpecs()['4.0']
|
|
50
58
|
|
|
51
|
-
test('the
|
|
52
|
-
|
|
53
|
-
<ApiSpecSelector
|
|
54
|
-
specs={specs}
|
|
55
|
-
spec={specState.spec}
|
|
56
|
-
specDispatch={specDispatch}
|
|
57
|
-
/>
|
|
58
|
-
)
|
|
59
|
-
|
|
59
|
+
test('the base spec is selected by default', () => {
|
|
60
|
+
renderWithReduxProvider(<ApiSpecSelector spec={spec} />)
|
|
60
61
|
const selector = screen.getByRole('textbox')
|
|
61
|
-
expect(selector).toHaveValue(`${
|
|
62
|
+
expect(selector).toHaveValue(`${spec.key}`)
|
|
62
63
|
})
|
|
63
64
|
|
|
64
65
|
test('it lists all available specs', async () => {
|
|
65
|
-
|
|
66
|
-
<ApiSpecSelector
|
|
67
|
-
specs={specs}
|
|
68
|
-
spec={specState.spec}
|
|
69
|
-
specDispatch={specDispatch}
|
|
70
|
-
/>
|
|
71
|
-
)
|
|
66
|
+
renderWithReduxProvider(<ApiSpecSelector spec={spec} />)
|
|
72
67
|
userEvent.click(screen.getByRole('textbox'))
|
|
73
68
|
await waitFor(() => {
|
|
74
69
|
expect(screen.getAllByRole('option')).toHaveLength(
|
|
@@ -77,25 +72,17 @@ describe('ApiSpecSelector', () => {
|
|
|
77
72
|
})
|
|
78
73
|
})
|
|
79
74
|
|
|
80
|
-
test('
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
await act(async () => {
|
|
90
|
-
await userEvent.click(screen.getByRole('textbox'))
|
|
91
|
-
await userEvent.click(screen.getByRole('option', { name: '3.1 current' }))
|
|
92
|
-
await waitFor(() => {
|
|
93
|
-
expect(specDispatch).toHaveBeenCalledTimes(1)
|
|
94
|
-
expect(specDispatch).toHaveBeenCalledWith({
|
|
95
|
-
type: 'SELECT_SPEC',
|
|
96
|
-
payload: '3.1',
|
|
97
|
-
})
|
|
98
|
-
})
|
|
75
|
+
test('requests selected spec', async () => {
|
|
76
|
+
const { push } = useHistory()
|
|
77
|
+
renderWithRouterAndReduxProvider(<ApiSpecSelector spec={spec} />)
|
|
78
|
+
userEvent.click(screen.getByRole('textbox'))
|
|
79
|
+
await waitFor(() => {
|
|
80
|
+
expect(screen.getAllByRole('option')).toHaveLength(
|
|
81
|
+
Object.keys(specs).length
|
|
82
|
+
)
|
|
99
83
|
})
|
|
84
|
+
const button = screen.getByText('3.1')
|
|
85
|
+
userEvent.click(button)
|
|
86
|
+
expect(push).toHaveBeenCalledWith('/3.1/methods/Dashboard/dashboard')
|
|
100
87
|
})
|
|
101
88
|
})
|
|
@@ -24,28 +24,23 @@
|
|
|
24
24
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import type { FC
|
|
27
|
+
import type { FC } from 'react'
|
|
28
28
|
import React from 'react'
|
|
29
29
|
import { Select } from '@looker/components'
|
|
30
30
|
import { useHistory, useLocation } from 'react-router-dom'
|
|
31
|
+
import type { SpecItem } from '@looker/sdk-codegen'
|
|
32
|
+
import { useSelector } from 'react-redux'
|
|
31
33
|
|
|
32
|
-
import
|
|
33
|
-
import type { SpecAction } from '../../reducers'
|
|
34
|
-
import { selectSpec } from '../../reducers'
|
|
34
|
+
import { selectSpecs } from '../../state'
|
|
35
35
|
|
|
36
36
|
interface ApiSpecSelectorProps {
|
|
37
|
-
specs: SpecList
|
|
38
37
|
spec: SpecItem
|
|
39
|
-
specDispatch: Dispatch<SpecAction>
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
export const ApiSpecSelector: FC<ApiSpecSelectorProps> = ({
|
|
43
|
-
specs,
|
|
44
|
-
spec,
|
|
45
|
-
specDispatch,
|
|
46
|
-
}) => {
|
|
40
|
+
export const ApiSpecSelector: FC<ApiSpecSelectorProps> = ({ spec }) => {
|
|
47
41
|
const history = useHistory()
|
|
48
42
|
const location = useLocation()
|
|
43
|
+
const specs = useSelector(selectSpecs)
|
|
49
44
|
const options = Object.entries(specs).map(([key, spec]) => ({
|
|
50
45
|
value: key,
|
|
51
46
|
label: key,
|
|
@@ -53,7 +48,6 @@ export const ApiSpecSelector: FC<ApiSpecSelectorProps> = ({
|
|
|
53
48
|
}))
|
|
54
49
|
|
|
55
50
|
const handleChange = (specKey: string) => {
|
|
56
|
-
specDispatch(selectSpec(specKey))
|
|
57
51
|
const matchPath = location.pathname.replace(`/${spec.key}`, `/${specKey}`)
|
|
58
52
|
history.push(matchPath)
|
|
59
53
|
}
|
|
@@ -28,28 +28,21 @@ import { act, screen, waitFor } from '@testing-library/react'
|
|
|
28
28
|
import { codeGenerators } from '@looker/sdk-codegen'
|
|
29
29
|
import userEvent from '@testing-library/user-event'
|
|
30
30
|
|
|
31
|
-
import {
|
|
31
|
+
import { getLoadedSpecs, specs } from '../../test-data'
|
|
32
32
|
import { renderWithRouterAndReduxProvider } from '../../test-utils'
|
|
33
33
|
import { defaultSettingsState } from '../../state'
|
|
34
34
|
import { SelectorContainer } from './SelectorContainer'
|
|
35
35
|
|
|
36
36
|
describe('SelectorContainer', () => {
|
|
37
|
-
const
|
|
38
|
-
|
|
37
|
+
const spec = getLoadedSpecs()['4.0']
|
|
39
38
|
beforeAll(() => {
|
|
40
39
|
window.HTMLElement.prototype.scrollIntoView = jest.fn()
|
|
41
40
|
})
|
|
42
41
|
|
|
43
42
|
test('it renders a spec selector with the correct default value and options', async () => {
|
|
44
|
-
renderWithRouterAndReduxProvider(
|
|
45
|
-
<SelectorContainer
|
|
46
|
-
specs={specs}
|
|
47
|
-
spec={specState.spec}
|
|
48
|
-
specDispatch={specDispatch}
|
|
49
|
-
/>
|
|
50
|
-
)
|
|
43
|
+
renderWithRouterAndReduxProvider(<SelectorContainer spec={spec} />)
|
|
51
44
|
const selector = screen.getByLabelText('spec selector')
|
|
52
|
-
expect(selector).toHaveValue(`${
|
|
45
|
+
expect(selector).toHaveValue(`${spec.key}`)
|
|
53
46
|
await act(async () => {
|
|
54
47
|
await userEvent.click(selector)
|
|
55
48
|
await waitFor(() => {
|
|
@@ -61,13 +54,7 @@ describe('SelectorContainer', () => {
|
|
|
61
54
|
})
|
|
62
55
|
|
|
63
56
|
test('it renders an sdk language selector with the correct value and options', async () => {
|
|
64
|
-
renderWithRouterAndReduxProvider(
|
|
65
|
-
<SelectorContainer
|
|
66
|
-
specs={specs}
|
|
67
|
-
spec={specState.spec}
|
|
68
|
-
specDispatch={specDispatch}
|
|
69
|
-
/>
|
|
70
|
-
)
|
|
57
|
+
renderWithRouterAndReduxProvider(<SelectorContainer spec={spec} />)
|
|
71
58
|
const selector = screen.getByLabelText('sdk language selector')
|
|
72
59
|
expect(selector).toHaveValue(defaultSettingsState.sdkLanguage)
|
|
73
60
|
await act(async () => {
|
|
@@ -81,19 +68,13 @@ describe('SelectorContainer', () => {
|
|
|
81
68
|
})
|
|
82
69
|
|
|
83
70
|
test('it renders an icon button for the differ', () => {
|
|
84
|
-
renderWithRouterAndReduxProvider(
|
|
85
|
-
<SelectorContainer
|
|
86
|
-
specs={specs}
|
|
87
|
-
spec={specState.spec}
|
|
88
|
-
specDispatch={specDispatch}
|
|
89
|
-
/>
|
|
90
|
-
)
|
|
71
|
+
renderWithRouterAndReduxProvider(<SelectorContainer spec={spec} />)
|
|
91
72
|
expect(
|
|
92
73
|
screen
|
|
93
74
|
.getByRole('button', {
|
|
94
75
|
name: 'Compare Specifications',
|
|
95
76
|
})
|
|
96
77
|
.closest('a')
|
|
97
|
-
).toHaveAttribute('href', `/diff/${
|
|
78
|
+
).toHaveAttribute('href', `/diff/${spec.key}/`)
|
|
98
79
|
})
|
|
99
80
|
})
|
|
@@ -24,25 +24,21 @@
|
|
|
24
24
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import type { FC
|
|
27
|
+
import type { FC } from 'react'
|
|
28
28
|
import React from 'react'
|
|
29
29
|
import type { SpaceHelperProps } from '@looker/components'
|
|
30
30
|
import { Space, IconButton } from '@looker/components'
|
|
31
31
|
import { ChangeHistory } from '@styled-icons/material/ChangeHistory'
|
|
32
|
-
import type {
|
|
32
|
+
import type { SpecItem } from '@looker/sdk-codegen'
|
|
33
|
+
|
|
33
34
|
import { Link } from '../Link'
|
|
34
|
-
import type { SpecAction } from '../../reducers'
|
|
35
35
|
import { diffPath } from '../../utils'
|
|
36
36
|
import { SdkLanguageSelector } from './SdkLanguageSelector'
|
|
37
37
|
import { ApiSpecSelector } from './ApiSpecSelector'
|
|
38
38
|
|
|
39
39
|
interface SelectorContainerProps extends SpaceHelperProps {
|
|
40
|
-
/** Specs to choose from */
|
|
41
|
-
specs: SpecList
|
|
42
40
|
/** Current selected spec */
|
|
43
41
|
spec: SpecItem
|
|
44
|
-
/** Spec state setter */
|
|
45
|
-
specDispatch: Dispatch<SpecAction>
|
|
46
42
|
}
|
|
47
43
|
|
|
48
44
|
export const HEADER_REM = 4
|
|
@@ -51,14 +47,12 @@ export const HEADER_REM = 4
|
|
|
51
47
|
* Renders a container for selectors
|
|
52
48
|
*/
|
|
53
49
|
export const SelectorContainer: FC<SelectorContainerProps> = ({
|
|
54
|
-
specs,
|
|
55
50
|
spec,
|
|
56
|
-
specDispatch,
|
|
57
51
|
...spaceProps
|
|
58
52
|
}) => (
|
|
59
53
|
<Space width="auto" {...spaceProps}>
|
|
60
54
|
<SdkLanguageSelector />
|
|
61
|
-
<ApiSpecSelector
|
|
55
|
+
<ApiSpecSelector spec={spec} />
|
|
62
56
|
<Link to={`/${diffPath}/${spec.key}/`}>
|
|
63
57
|
<IconButton
|
|
64
58
|
toggle
|
|
@@ -28,15 +28,15 @@ import { criteriaToSet } from '@looker/sdk-codegen'
|
|
|
28
28
|
import userEvent from '@testing-library/user-event'
|
|
29
29
|
import { screen, waitFor } from '@testing-library/react'
|
|
30
30
|
|
|
31
|
-
import { getLoadedSpecs
|
|
31
|
+
import { getLoadedSpecs } from '../../test-data'
|
|
32
32
|
import { renderWithRouterAndReduxProvider } from '../../test-utils'
|
|
33
33
|
import { defaultSettingsState } from '../../state'
|
|
34
34
|
import { SideNav } from './SideNav'
|
|
35
35
|
import { countMethods, countTypes } from './searchUtils'
|
|
36
36
|
|
|
37
|
+
const spec = getLoadedSpecs()['4.0']
|
|
38
|
+
|
|
37
39
|
describe('SideNav', () => {
|
|
38
|
-
const specs = getLoadedSpecs()
|
|
39
|
-
const specDispatch = jest.fn()
|
|
40
40
|
const allTagsPattern = /^(Auth|ApiAuth)$/
|
|
41
41
|
const allTypesPattern = /^(WriteDashboard|WriteQuery)$/
|
|
42
42
|
|
|
@@ -55,13 +55,7 @@ describe('SideNav', () => {
|
|
|
55
55
|
})
|
|
56
56
|
|
|
57
57
|
test('it renders search, methods tab and types tab', () => {
|
|
58
|
-
renderWithRouterAndReduxProvider(
|
|
59
|
-
<SideNav
|
|
60
|
-
specs={specs}
|
|
61
|
-
spec={specState.spec}
|
|
62
|
-
specDispatch={specDispatch}
|
|
63
|
-
/>
|
|
64
|
-
)
|
|
58
|
+
renderWithRouterAndReduxProvider(<SideNav spec={spec} />)
|
|
65
59
|
const search = screen.getByLabelText('Search')
|
|
66
60
|
expect(search).toHaveProperty('placeholder', 'Search')
|
|
67
61
|
const tabs = screen.getAllByRole('tab', {
|
|
@@ -69,23 +63,14 @@ describe('SideNav', () => {
|
|
|
69
63
|
})
|
|
70
64
|
expect(tabs).toHaveLength(2)
|
|
71
65
|
expect(tabs[0]).toHaveTextContent(
|
|
72
|
-
`Methods (${countMethods(
|
|
66
|
+
`Methods (${countMethods(spec.api!.tags)})`
|
|
73
67
|
)
|
|
74
68
|
|
|
75
|
-
expect(tabs[1]).toHaveTextContent(
|
|
76
|
-
`Types (${countTypes(specState.spec.api!.types)})`
|
|
77
|
-
)
|
|
69
|
+
expect(tabs[1]).toHaveTextContent(`Types (${countTypes(spec.api!.types)})`)
|
|
78
70
|
})
|
|
79
71
|
|
|
80
72
|
test('Methods tab is the default active tab', () => {
|
|
81
|
-
renderWithRouterAndReduxProvider(
|
|
82
|
-
<SideNav
|
|
83
|
-
specs={specs}
|
|
84
|
-
spec={specState.spec}
|
|
85
|
-
specDispatch={specDispatch}
|
|
86
|
-
/>,
|
|
87
|
-
['/3.1/methods']
|
|
88
|
-
)
|
|
73
|
+
renderWithRouterAndReduxProvider(<SideNav spec={spec} />, ['/3.1/methods'])
|
|
89
74
|
expect(screen.getAllByText(allTagsPattern)).toHaveLength(2)
|
|
90
75
|
expect(
|
|
91
76
|
screen.queryAllByRole('link', { name: allTypesPattern })
|
|
@@ -97,47 +82,29 @@ describe('SideNav', () => {
|
|
|
97
82
|
})
|
|
98
83
|
|
|
99
84
|
test('url determines active tab', () => {
|
|
100
|
-
renderWithRouterAndReduxProvider(
|
|
101
|
-
<SideNav
|
|
102
|
-
specs={specs}
|
|
103
|
-
spec={specState.spec}
|
|
104
|
-
specDispatch={specDispatch}
|
|
105
|
-
/>,
|
|
106
|
-
['/3.1/types']
|
|
107
|
-
)
|
|
85
|
+
renderWithRouterAndReduxProvider(<SideNav spec={spec} />, ['/3.1/types'])
|
|
108
86
|
// eslint-disable-next-line jest-dom/prefer-in-document
|
|
109
87
|
expect(screen.queryAllByText(allTagsPattern)).toHaveLength(2)
|
|
110
88
|
})
|
|
111
89
|
})
|
|
112
90
|
|
|
113
91
|
describe('Search', () => {
|
|
114
|
-
const specs = getLoadedSpecs()
|
|
115
|
-
const specDispatch = jest.fn()
|
|
116
|
-
|
|
117
92
|
test('it filters methods and types on input', async () => {
|
|
118
|
-
renderWithRouterAndReduxProvider(
|
|
119
|
-
<SideNav
|
|
120
|
-
specs={specs}
|
|
121
|
-
spec={specState.spec}
|
|
122
|
-
specDispatch={specDispatch}
|
|
123
|
-
/>
|
|
124
|
-
)
|
|
93
|
+
renderWithRouterAndReduxProvider(<SideNav spec={spec} />)
|
|
125
94
|
const searchPattern = 'embedsso'
|
|
126
95
|
const input = screen.getByLabelText('Search')
|
|
127
|
-
jest.spyOn(
|
|
96
|
+
jest.spyOn(spec.api!, 'search')
|
|
128
97
|
/** Pasting to avoid triggering search multiple times */
|
|
129
98
|
await userEvent.paste(input, searchPattern)
|
|
130
99
|
await waitFor(() => {
|
|
131
|
-
expect(
|
|
100
|
+
expect(spec.api!.search).toHaveBeenCalledWith(
|
|
132
101
|
searchPattern,
|
|
133
102
|
criteriaToSet(defaultSettingsState.searchCriteria)
|
|
134
103
|
)
|
|
135
104
|
const methods = screen.getByRole('tab', { name: 'Methods (1)' })
|
|
136
105
|
userEvent.click(methods)
|
|
137
106
|
expect(
|
|
138
|
-
screen.getByText(
|
|
139
|
-
specState.spec.api!.tags.Auth.create_sso_embed_url.summary
|
|
140
|
-
)
|
|
107
|
+
screen.getByText(spec.api!.tags.Auth.create_sso_embed_url.summary)
|
|
141
108
|
).toBeInTheDocument()
|
|
142
109
|
const types = screen.getByRole('tab', { name: 'Types (1)' })
|
|
143
110
|
userEvent.click(types)
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
import type { FC
|
|
27
|
+
import type { FC } from 'react'
|
|
28
28
|
import React, { useEffect, useState } from 'react'
|
|
29
29
|
import { useHistory, useLocation } from 'react-router-dom'
|
|
30
30
|
import {
|
|
@@ -37,7 +37,6 @@ import {
|
|
|
37
37
|
} from '@looker/components'
|
|
38
38
|
import type {
|
|
39
39
|
SpecItem,
|
|
40
|
-
SpecList,
|
|
41
40
|
ISearchResult,
|
|
42
41
|
ApiModel,
|
|
43
42
|
TagList,
|
|
@@ -46,7 +45,6 @@ import type {
|
|
|
46
45
|
import { criteriaToSet, tagTypes } from '@looker/sdk-codegen'
|
|
47
46
|
import { useSelector } from 'react-redux'
|
|
48
47
|
|
|
49
|
-
import type { SpecAction } from '../../reducers'
|
|
50
48
|
import { useWindowSize } from '../../utils'
|
|
51
49
|
import { HEADER_REM } from '../Header'
|
|
52
50
|
import { selectSearchCriteria, useSettingActions } from '../../state'
|
|
@@ -65,12 +63,8 @@ interface SideNavState {
|
|
|
65
63
|
|
|
66
64
|
interface SideNavProps {
|
|
67
65
|
headless?: boolean
|
|
68
|
-
/** Specs to choose from */
|
|
69
|
-
specs: SpecList
|
|
70
66
|
/** Current selected spec */
|
|
71
67
|
spec: SpecItem
|
|
72
|
-
/** Spec state setter */
|
|
73
|
-
specDispatch: Dispatch<SpecAction>
|
|
74
68
|
}
|
|
75
69
|
|
|
76
70
|
export const SideNav: FC<SideNavProps> = ({ headless = false, spec }) => {
|
package/src/components/index.ts
CHANGED
package/src/index.ts
CHANGED
package/src/routes/AppRouter.tsx
CHANGED
|
@@ -28,8 +28,6 @@ import type { FC } from 'react'
|
|
|
28
28
|
import React from 'react'
|
|
29
29
|
import { Redirect, Route, Switch } from 'react-router-dom'
|
|
30
30
|
import type { ApiModel, SpecList } from '@looker/sdk-codegen'
|
|
31
|
-
import type { RunItSetter } from '@looker/run-it'
|
|
32
|
-
import type { IEnvironmentAdaptor } from '@looker/extension-utils'
|
|
33
31
|
|
|
34
32
|
import {
|
|
35
33
|
HomeScene,
|
|
@@ -42,47 +40,37 @@ import { DiffScene } from '../scenes/DiffScene'
|
|
|
42
40
|
import { diffPath } from '../utils'
|
|
43
41
|
|
|
44
42
|
interface AppRouterProps {
|
|
45
|
-
api: ApiModel
|
|
46
43
|
specKey: string
|
|
47
44
|
specs: SpecList
|
|
45
|
+
api: ApiModel
|
|
48
46
|
toggleNavigation: (target?: boolean) => void
|
|
49
|
-
adaptor: IEnvironmentAdaptor
|
|
50
|
-
setVersionsUrl: RunItSetter
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
export const AppRouter: FC<AppRouterProps> = ({
|
|
54
|
-
specKey,
|
|
55
50
|
api,
|
|
51
|
+
specKey,
|
|
56
52
|
specs,
|
|
57
53
|
toggleNavigation,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
<TypeTagScene api={api} />
|
|
82
|
-
</Route>
|
|
83
|
-
<Route path="/:specKey/types/:typeTag/:typeName">
|
|
84
|
-
<TypeScene api={api} />
|
|
85
|
-
</Route>
|
|
86
|
-
</Switch>
|
|
87
|
-
)
|
|
88
|
-
}
|
|
54
|
+
}) => (
|
|
55
|
+
<Switch>
|
|
56
|
+
<Redirect from="/" to={`/${specKey}/`} exact />
|
|
57
|
+
<Route path={`/${diffPath}/:l?/:r?`}>
|
|
58
|
+
<DiffScene specs={specs} toggleNavigation={toggleNavigation} />
|
|
59
|
+
</Route>
|
|
60
|
+
<Route path="/:specKey/(methods|types)?" exact>
|
|
61
|
+
<HomeScene api={api} />
|
|
62
|
+
</Route>
|
|
63
|
+
<Route path="/:specKey/methods/:methodTag" exact>
|
|
64
|
+
<MethodTagScene api={api} />
|
|
65
|
+
</Route>
|
|
66
|
+
<Route path="/:specKey/methods/:methodTag/:methodName">
|
|
67
|
+
<MethodScene api={api} />
|
|
68
|
+
</Route>
|
|
69
|
+
<Route path="/:specKey/types/:typeTag" exact>
|
|
70
|
+
<TypeTagScene api={api} />
|
|
71
|
+
</Route>
|
|
72
|
+
<Route path="/:specKey/types/:typeTag/:typeName">
|
|
73
|
+
<TypeScene api={api} />
|
|
74
|
+
</Route>
|
|
75
|
+
</Switch>
|
|
76
|
+
)
|