@icij/murmur-next 4.0.0 → 4.0.1
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/README.md +15 -19
- package/dist/lib/components/AccordionStep.vue.d.ts +79 -0
- package/dist/lib/components/AccordionWrapper.vue.d.ts +33 -0
- package/dist/lib/components/ActiveTextTruncate.vue.d.ts +101 -0
- package/dist/lib/components/AdvancedLinkForm.vue.d.ts +168 -0
- package/dist/lib/components/Brand.vue.d.ts +55 -0
- package/dist/lib/components/BrandExpansion.vue.d.ts +105 -0
- package/dist/lib/components/ConfirmButton.vue.d.ts +158 -0
- package/dist/lib/components/ContentPlaceholder.vue.d.ts +44 -0
- package/dist/lib/components/CustomPagination.vue.d.ts +130 -0
- package/dist/lib/components/DigitsInput.vue.d.ts +66 -0
- package/dist/lib/components/DonateForm.vue.d.ts +46 -0
- package/dist/lib/components/EmbedForm.vue.d.ts +121 -0
- package/dist/lib/components/EmbeddableFooter.vue.d.ts +103 -0
- package/dist/lib/components/FollowUsPopover.vue.d.ts +16 -0
- package/dist/lib/components/GenericFooter.vue.d.ts +47 -0
- package/dist/lib/components/GenericHeader.vue.d.ts +928 -0
- package/dist/lib/components/HapticCopy.vue.d.ts +156 -0
- package/dist/lib/components/ImddbHeader.vue.d.ts +960 -0
- package/dist/lib/components/OrdinalLegend.vue.d.ts +87 -0
- package/dist/lib/components/RangePicker.vue.d.ts +196 -0
- package/dist/lib/components/ResponsiveIframe.vue.d.ts +45 -0
- package/dist/lib/components/ScaleLegend.vue.d.ts +101 -0
- package/dist/lib/components/SecretInput.vue.d.ts +99 -0
- package/dist/lib/components/SelectableDropdown.vue.d.ts +210 -0
- package/dist/lib/components/SharingOptions.vue.d.ts +153 -0
- package/dist/lib/components/SharingOptionsLink.vue.d.ts +200 -0
- package/dist/lib/components/SignUpForm.vue.d.ts +141 -0
- package/dist/lib/components/SlideUpDown.vue.d.ts +74 -0
- package/dist/lib/components/TexturedDeck.vue.d.ts +89 -0
- package/dist/lib/components/TinyPagination.vue.d.ts +188 -0
- package/dist/lib/composables/chart.d.ts +48 -0
- package/dist/lib/composables/resizeObserver.d.ts +22 -0
- package/dist/lib/composables/sendEmail.d.ts +6 -0
- package/dist/lib/config.d.ts +19 -0
- package/dist/lib/config.default.d.ts +34 -0
- package/dist/lib/datavisualisations/BarChart.vue.d.ts +234 -0
- package/dist/lib/datavisualisations/ColumnChart.vue.d.ts +404 -0
- package/dist/lib/datavisualisations/LineChart.vue.d.ts +200 -0
- package/dist/lib/datavisualisations/StackedBarChart.vue.d.ts +342 -0
- package/dist/lib/datavisualisations/StackedColumnChart.vue.d.ts +412 -0
- package/dist/lib/enums.d.ts +32 -0
- package/dist/lib/i18n.d.ts +4 -0
- package/dist/lib/keys.d.ts +2 -0
- package/dist/lib/main.d.ts +52 -0
- package/dist/lib/maps/ChoroplethMap.vue.d.ts +460 -0
- package/dist/lib/maps/ChoroplethMapAnnotation.vue.d.ts +188 -0
- package/dist/lib/maps/SymbolMap.vue.d.ts +276 -0
- package/dist/lib/murmur.css +1 -0
- package/dist/lib/murmur.js +44661 -0
- package/dist/lib/murmur.js.map +1 -0
- package/dist/lib/murmur.umd.cjs +837 -0
- package/dist/lib/murmur.umd.cjs.map +1 -0
- package/dist/lib/types.d.ts +44 -0
- package/dist/lib/utils/animation.d.ts +8 -0
- package/dist/lib/utils/assets.d.ts +2 -0
- package/dist/lib/utils/clipboard.d.ts +2 -0
- package/dist/lib/utils/iframe-resizer.d.ts +10 -0
- package/dist/lib/utils/placeholder.d.ts +12 -0
- package/dist/lib/utils/placeholderTypes.d.ts +18 -0
- package/dist/lib/utils/strings.d.ts +1 -0
- package/package.json +15 -1
- package/.github/workflows/deploy-github-pages.yaml +0 -50
- package/.storybook/app.scss +0 -14
- package/.storybook/doc_variables.scss +0 -20
- package/.storybook/main.ts +0 -35
- package/.storybook/preview-head.html +0 -2
- package/.storybook/preview.ts +0 -32
- package/deploy.js +0 -15
- package/docs/components/ApiTable.vue +0 -171
- package/docs/components/App.vue +0 -146
- package/docs/components/CollapsibleBlock.vue +0 -122
- package/docs/components/DocsHeader.vue +0 -68
- package/docs/components/DocsMenu.vue +0 -201
- package/docs/components/DocsMenuSection.vue +0 -109
- package/docs/components/EditLink.vue +0 -49
- package/docs/components/OutboundLink.vue +0 -13
- package/docs/components/PalettePresenter.vue +0 -96
- package/docs/components/RepositoryLink.vue +0 -28
- package/docs/components/SampleCard.vue +0 -119
- package/docs/main.js +0 -42
- package/docs/pages/components/accordion/doc.md +0 -96
- package/docs/pages/components/active-text-truncate/doc.md +0 -44
- package/docs/pages/components/advanced-link-form/doc.md +0 -105
- package/docs/pages/components/brand/doc.md +0 -30
- package/docs/pages/components/brand-expansion/doc.md +0 -70
- package/docs/pages/components/confirm-button/doc.md +0 -91
- package/docs/pages/components/content-placeholder/doc.md +0 -16
- package/docs/pages/components/custom-pagination/doc.md +0 -61
- package/docs/pages/components/digits-input/doc.md +0 -28
- package/docs/pages/components/donate-form/doc.md +0 -20
- package/docs/pages/components/embed-form/doc.md +0 -22
- package/docs/pages/components/embeddable-footer/doc.md +0 -60
- package/docs/pages/components/follow-us-popover/doc.md +0 -5
- package/docs/pages/components/generic-footer/doc.md +0 -21
- package/docs/pages/components/generic-header/doc.md +0 -24
- package/docs/pages/components/haptic-copy/doc.md +0 -27
- package/docs/pages/components/imddb-header/doc.md +0 -23
- package/docs/pages/components/ordinal-legend/doc.md +0 -44
- package/docs/pages/components/range-picker/doc.md +0 -86
- package/docs/pages/components/responsive-iframe/doc.md +0 -13
- package/docs/pages/components/scale-legend/doc.md +0 -65
- package/docs/pages/components/secret-input/doc.md +0 -12
- package/docs/pages/components/selectable-dropdown/doc.md +0 -156
- package/docs/pages/components/sharing-options/doc.md +0 -13
- package/docs/pages/components/sharing-options-link/doc.md +0 -36
- package/docs/pages/components/sign-up-form/doc.md +0 -13
- package/docs/pages/components/slide-up-down/doc.md +0 -28
- package/docs/pages/components/textured-deck/doc.md +0 -78
- package/docs/pages/components/tiny-pagination/doc.md +0 -92
- package/docs/pages/datavisualisation/bars/doc.md +0 -110
- package/docs/pages/datavisualisation/columns/doc.md +0 -165
- package/docs/pages/datavisualisation/lines/doc.md +0 -139
- package/docs/pages/datavisualisation/stacked-bar/doc.md +0 -160
- package/docs/pages/datavisualisation/stacked-column/doc.md +0 -191
- package/docs/pages/getting-started/about-icij/doc.md +0 -13
- package/docs/pages/getting-started/custom-bootstrap/doc.md +0 -36
- package/docs/pages/getting-started/installation-guide/doc.md +0 -59
- package/docs/pages/getting-started/internationalization/doc.md +0 -74
- package/docs/pages/maps/choropleth-map/doc.md +0 -420
- package/docs/pages/maps/choropleth-map-annotation/doc.md +0 -373
- package/docs/pages/maps/symbol-map/doc.md +0 -203
- package/docs/pages/structure/breakpoints/doc.md +0 -3
- package/docs/pages/structure/grid/doc.md +0 -3
- package/docs/pages/utilities/assets/doc.md +0 -138
- package/docs/pages/utilities/config/doc.md +0 -52
- package/docs/pages/utilities/iframes/doc.md +0 -3
- package/docs/pages/visual/colors/doc.md +0 -31
- package/docs/pages/visual/iconography/doc.md +0 -56
- package/docs/pages/visual/states/doc.md +0 -77
- package/docs/pages/visual/themes/doc.md +0 -3
- package/docs/pages/visual/typography/doc.md +0 -71
- package/docs/routes.js +0 -25
- package/docs/store/index.js +0 -21
- package/docs/styles/app.scss +0 -36
- package/docs/styles/variables.scss +0 -20
- package/loaders/highlight-loader.js +0 -13
- package/loaders/markdown-loader.js +0 -91
- package/loaders/metadata-loader.js +0 -18
- package/loaders/sass-extract-loader.js +0 -14
- package/loaders/vue-docgen-loader.js +0 -14
- package/plugins/MdPluginTypes.ts +0 -10
- package/plugins/docs.ts +0 -50
- package/plugins/front-matter.ts +0 -36
- package/plugins/highlight.ts +0 -27
- package/plugins/markdown-it/api-table.ts +0 -25
- package/plugins/markdown-it/sample-card.ts +0 -31
- package/plugins/plugin-delete.ts +0 -47
- package/plugins/plugin-docgen.ts +0 -23
- package/plugins/sass-vars.ts +0 -25
- package/plugins/vue-docgen.ts +0 -29
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/img/arrow-bottom.svg +0 -3
- package/public/assets/img/texture-brick-black.jpg +0 -0
- package/public/assets/img/texture-brick.jpg +0 -0
- package/public/assets/img/texture-carbon-black.jpg +0 -0
- package/public/assets/img/texture-carbon.jpg +0 -0
- package/public/assets/img/texture-crack-black.jpg +0 -0
- package/public/assets/img/texture-crack.jpg +0 -0
- package/public/assets/img/texture-rock-black.jpg +0 -0
- package/public/assets/img/texture-rock.jpg +0 -0
- package/public/assets/img/texture-sand-black.jpg +0 -0
- package/public/assets/img/texture-sand.jpg +0 -0
- package/public/assets/img/texture-silk-black.jpg +0 -0
- package/public/assets/img/texture-silk.jpg +0 -0
- package/public/assets/topojson/france-departments.json +0 -1
- package/public/assets/topojson/paris-arrondissements.json +0 -1
- package/public/assets/topojson/world-countries-sans-antarctica.json +0 -1
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/site.webmanifest +0 -1
- package/stories/assets/code-brackets.svg +0 -1
- package/stories/assets/colors.svg +0 -1
- package/stories/assets/comments.svg +0 -1
- package/stories/assets/direction.svg +0 -1
- package/stories/assets/flow.svg +0 -1
- package/stories/assets/plugin.svg +0 -1
- package/stories/assets/repo.svg +0 -1
- package/stories/assets/stackalt.svg +0 -1
- package/stories/getting-started/about-icij.mdx +0 -14
- package/stories/getting-started/custom-bootstrap.mdx +0 -23
- package/stories/getting-started/installation-guide.mdx +0 -62
- package/stories/getting-started/internationalization.mdx +0 -63
- package/stories/murmur/components/AccordionStep.stories.ts +0 -33
- package/stories/murmur/components/AccordionWrapper.stories.ts +0 -69
- package/stories/murmur/components/ActiveTextTruncate.stories.ts +0 -32
- package/stories/murmur/components/AdvancedLinkForm.stories.ts +0 -77
- package/stories/murmur/components/Brand.stories.ts +0 -30
- package/stories/murmur/components/BrandExpansion.stories.ts +0 -41
- package/stories/murmur/components/ConfirmButton.stories.ts +0 -40
- package/stories/murmur/components/ContentPlaceholder.stories.ts +0 -41
- package/stories/murmur/components/CustomPagination.stories.ts +0 -42
- package/stories/murmur/components/DigitsInput.stories.ts +0 -29
- package/stories/murmur/components/DonateForm.stories.ts +0 -29
- package/stories/murmur/components/EmbedForm.stories.ts +0 -35
- package/stories/murmur/components/EmbeddableFooter.stories.ts +0 -59
- package/stories/murmur/components/FollowUsPopover.stories.ts +0 -24
- package/stories/murmur/components/GenericFooter.stories.ts +0 -27
- package/stories/murmur/components/GenericHeader.stories.ts +0 -27
- package/stories/murmur/components/HapticCopy.stories.ts +0 -40
- package/stories/murmur/components/ImddbHeader.stories.ts +0 -27
- package/stories/murmur/components/OrdinalLegend.stories.ts +0 -49
- package/stories/murmur/components/RangePicker.stories.ts +0 -98
- package/stories/murmur/components/ResponsiveIframe.stories.ts +0 -24
- package/stories/murmur/components/ScaleLegend.stories.ts +0 -65
- package/stories/murmur/components/SecretInput.stories.ts +0 -60
- package/stories/murmur/components/SelectableDropdown.stories.ts +0 -143
- package/stories/murmur/components/SharingOptions.stories.ts +0 -32
- package/stories/murmur/components/SharingOptionsLink.stories.ts +0 -53
- package/stories/murmur/components/SignUpForm.stories.ts +0 -51
- package/stories/murmur/components/SlideUpDown.stories.ts +0 -32
- package/stories/murmur/components/TexturedDeck.stories.ts +0 -83
- package/stories/murmur/components/TinyPagination.stories.ts +0 -65
- package/stories/murmur/datavisualisations/BarChart.stories.ts +0 -54
- package/stories/murmur/datavisualisations/ColumnChart.stories.ts +0 -88
- package/stories/murmur/datavisualisations/LineChart.stories.ts +0 -139
- package/stories/murmur/datavisualisations/StackedBarChart.stories.ts +0 -199
- package/stories/murmur/datavisualisations/StackedColumnChart.stories.ts +0 -136
- package/stories/murmur/decorators.ts +0 -108
- package/stories/murmur/maps/ChoroplethMap.stories.ts +0 -440
- package/stories/murmur/maps/ChoroplethMapAnnotation.stories.ts +0 -26
- package/stories/murmur/maps/SymbolMap.stories.ts +0 -24
- package/stories/murmur/utils.ts +0 -7
- package/tests/unit/components/AccordionStep.spec.ts +0 -157
- package/tests/unit/components/AccordionWrapper.spec.ts +0 -57
- package/tests/unit/components/ActiveTextTruncate.spec.js +0 -30
- package/tests/unit/components/AdvancedLinkForm.spec.js +0 -124
- package/tests/unit/components/Brand.spec.js +0 -50
- package/tests/unit/components/ContentPlaceholder.spec.js +0 -29
- package/tests/unit/components/CustomPagination.spec.js +0 -72
- package/tests/unit/components/DigitsInput.spec.ts +0 -157
- package/tests/unit/components/DonateForm.spec.js +0 -149
- package/tests/unit/components/EmbedForm.spec.js +0 -108
- package/tests/unit/components/EmbeddableFooter.spec.js +0 -11
- package/tests/unit/components/Fa.spec.js +0 -18
- package/tests/unit/components/FollowUsPopover.spec.js +0 -29
- package/tests/unit/components/GenericFooter.spec.js +0 -29
- package/tests/unit/components/GenericHeader.spec.js +0 -104
- package/tests/unit/components/HapticCopy.spec.js +0 -123
- package/tests/unit/components/ImddbHeader.spec.js +0 -96
- package/tests/unit/components/OrdinalLegend.spec.js +0 -120
- package/tests/unit/components/RangePicker.spec.ts +0 -87
- package/tests/unit/components/ResponsiveIframe.spec.js +0 -20
- package/tests/unit/components/ScaleLegend.spec.js +0 -139
- package/tests/unit/components/SecretInput.spec.js +0 -81
- package/tests/unit/components/SelectableDropdown.spec.js +0 -160
- package/tests/unit/components/SharingOptions.spec.js +0 -125
- package/tests/unit/components/SharingOptionsLink.spec.js +0 -184
- package/tests/unit/components/SignUpForm.spec.js +0 -145
- package/tests/unit/components/SlideUpDown.spec.js +0 -59
- package/tests/unit/components/TinyPagination.spec.js +0 -46
- package/tests/unit/config.spec.js +0 -136
- package/tests/unit/datavisualisations/BarChart.spec.js +0 -63
- package/tests/unit/datavisualisations/ColumnChart.spec.js +0 -344
- package/tests/unit/datavisualisations/LineChart.spec.js +0 -155
- package/tests/unit/datavisualisations/StackedBarChart.spec.js +0 -294
- package/tests/unit/datavisualisations/StackedColumnChart.spec.js +0 -443
- package/tests/unit/i18n.spec.ts +0 -19
- package/tests/unit/main.spec.js +0 -82
- package/tests/unit/maps/ChoroplethMap.spec.js +0 -214
- package/tests/unit/maps/ChoroplethMapAnnotation.spec.ts +0 -186
- package/tests/unit/maps/SymbolMap.spec.js +0 -92
- package/tests/unit/require.spec.js +0 -22
- package/tests/unit/setup.js +0 -13
- package/tests/unit/utils/assets.spec.js +0 -61
- package/tests/unit/utils/clipboard.spec.js +0 -18
- package/tests/unit/utils/iframe-resizer.spec.js +0 -71
- package/tsconfig.json +0 -35
- package/vite.config.ts +0 -79
- package/vitest.config.ts +0 -19
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'fs'
|
|
2
|
-
import { join, resolve } from 'path'
|
|
3
|
-
import { zipObjectDeep } from 'lodash'
|
|
4
|
-
import { shallowMount,flushPromises } from '@vue/test-utils'
|
|
5
|
-
import ChoroplethMap from '@/maps/ChoroplethMap.vue'
|
|
6
|
-
|
|
7
|
-
vi.mock('d3', async () => {
|
|
8
|
-
return {
|
|
9
|
-
...(await vi.importActual('d3')),
|
|
10
|
-
json: async url => {
|
|
11
|
-
const pathname = url.split('https://icij.github.io/murmur/').pop()
|
|
12
|
-
const abspath = resolve(__dirname, join('../../../public', pathname))
|
|
13
|
-
const raw = await fs.readFile(abspath, 'UTF-8')
|
|
14
|
-
return JSON.parse(raw)
|
|
15
|
-
},
|
|
16
|
-
zoom() {
|
|
17
|
-
const zoom = {
|
|
18
|
-
scaleExtent: () => zoom,
|
|
19
|
-
translateExtent: () => zoom,
|
|
20
|
-
transform: () => null,
|
|
21
|
-
on: () => zoom
|
|
22
|
-
}
|
|
23
|
-
return zoom
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
describe('ChoroplethMap.vue', () => {
|
|
29
|
-
|
|
30
|
-
describe('a map of the world', () => {
|
|
31
|
-
|
|
32
|
-
let wrapper
|
|
33
|
-
|
|
34
|
-
beforeEach(async () => {
|
|
35
|
-
const propsData = {
|
|
36
|
-
data: {
|
|
37
|
-
FRA: 100,
|
|
38
|
-
SRB: 150,
|
|
39
|
-
KGZ: 200
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
wrapper = shallowMount(ChoroplethMap, { propsData, global:{renderDefaultStub:true} })
|
|
43
|
-
wrapper.vm.$refs.resizable.style.width = '500px'
|
|
44
|
-
await wrapper.vm.loadTopojson()
|
|
45
|
-
await wrapper.vm.$nextTick()
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('is a Vue instance', () => {
|
|
49
|
-
expect(wrapper.vm).toBeTruthy()
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('has a feature for KGZ with the end color of the scale', () => {
|
|
53
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-kgz')
|
|
54
|
-
const color = window.getComputedStyle(feature.wrapperElement).color
|
|
55
|
-
expect(color).toBe('rgb(133, 35, 8)')
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('has a feature for SRV with the middle color of the scale', () => {
|
|
59
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-srb')
|
|
60
|
-
const color = window.getComputedStyle(feature.element).color
|
|
61
|
-
expect(color).toBe('rgb(194, 145, 132)')
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('has a feature for FRA with the start color of the scale', () => {
|
|
65
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-fra')
|
|
66
|
-
const color = window.getComputedStyle(feature.element).color
|
|
67
|
-
expect(color).toBe('rgb(255, 255, 255)')
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('activates the cursor when mouse is over a feature', () => {
|
|
71
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-kgz')
|
|
72
|
-
feature.element.dispatchEvent(new Event('mouseover'))
|
|
73
|
-
expect(wrapper.vm.featureCursor).toBe('KGZ')
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('changes the cursor when mouse is over another feature', () => {
|
|
77
|
-
wrapper.vm.updateFeatureCursor('KGZ')
|
|
78
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-fra')
|
|
79
|
-
feature.element.dispatchEvent(new Event('mouseover'))
|
|
80
|
-
expect(wrapper.vm.featureCursor).toBe('FRA')
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('deactivates the cursor when mouse leaves a feature', () => {
|
|
84
|
-
wrapper.vm.updateFeatureCursor('KGZ')
|
|
85
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-kgz')
|
|
86
|
-
feature.element.dispatchEvent(new Event('mouseleave'))
|
|
87
|
-
expect(wrapper.vm.featureCursor).toBeNull()
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('doesnt actve the cursor when mouse is over a feature without data', () => {
|
|
91
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-usa')
|
|
92
|
-
feature.element.dispatchEvent(new Event('mouseover'))
|
|
93
|
-
expect(wrapper.vm.featureCursor).toBeNull()
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('set a class to the component when a cursor is active', async () => {
|
|
97
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-kgz')
|
|
98
|
-
feature.element.dispatchEvent(new Event('mouseover'))
|
|
99
|
-
await wrapper.vm.$nextTick()
|
|
100
|
-
expect(wrapper.classes('choropleth-map--has-cursor')).toBeTruthy()
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('remove the class to the component when a cursor is removed', async () => {
|
|
104
|
-
wrapper.vm.updateFeatureCursor('KGZ')
|
|
105
|
-
await wrapper.vm.$nextTick()
|
|
106
|
-
expect(wrapper.classes('choropleth-map--has-cursor')).toBeTruthy()
|
|
107
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-kgz')
|
|
108
|
-
feature.element.dispatchEvent(new Event('mouseleave'))
|
|
109
|
-
await wrapper.vm.$nextTick()
|
|
110
|
-
expect(wrapper.classes('choropleth-map--has-cursor')).toBeFalsy()
|
|
111
|
-
})
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
describe('a clickable map of france with data on 3 departments', () => {
|
|
116
|
-
|
|
117
|
-
let wrapper
|
|
118
|
-
|
|
119
|
-
beforeEach(async () => {
|
|
120
|
-
const propsData = {
|
|
121
|
-
topojsonUrl: '/assets/topojson/france-departments.json',
|
|
122
|
-
topojsonObjects: 'departements',
|
|
123
|
-
topojsonObjectsPath: 'properties.code',
|
|
124
|
-
clickable: true,
|
|
125
|
-
transitionDuration: 0,
|
|
126
|
-
data: {
|
|
127
|
-
"01": 100,
|
|
128
|
-
"02": 150,
|
|
129
|
-
"03": 200
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
wrapper = shallowMount(ChoroplethMap, { propsData })
|
|
133
|
-
wrapper.vm.$refs.resizable.style.width = '500px'
|
|
134
|
-
await wrapper.vm.loadTopojson()
|
|
135
|
-
await wrapper.vm.$nextTick()
|
|
136
|
-
// Since JSDOM badly lack SVG support, we need to mock
|
|
137
|
-
// some low level attributes such as size of the SVG element.
|
|
138
|
-
wrapper.vm.setMapNodeSize({
|
|
139
|
-
width:zipObjectDeep(['baseVal.width.value'], [500]),
|
|
140
|
-
height:zipObjectDeep(['baseVal.height.value'], [300])
|
|
141
|
-
})
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
it('is a Vue instance', () => {
|
|
145
|
-
expect(wrapper.vm).toBeTruthy()
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('has a feature for 01 with the start color of the scale', () => {
|
|
149
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-01')
|
|
150
|
-
const color = window.getComputedStyle(feature.element).color
|
|
151
|
-
expect(color).toBe('rgb(255, 255, 255)')
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
it('has a feature for 02 with the middle color of the scale', () => {
|
|
155
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-02')
|
|
156
|
-
const color = window.getComputedStyle(feature.element).color
|
|
157
|
-
expect(color).toBe('rgb(194, 145, 132)')
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('has a feature for 03 with the end color of the scale', () => {
|
|
161
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
162
|
-
const color = window.getComputedStyle(feature.element).color
|
|
163
|
-
expect(color).toBe('rgb(133, 35, 8)')
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
it('zooms on the map when a feature is clicked', async () => {
|
|
167
|
-
|
|
168
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
169
|
-
await feature.trigger('click')
|
|
170
|
-
|
|
171
|
-
const zoomed = wrapper.emitted("zoomed");
|
|
172
|
-
|
|
173
|
-
expect(zoomed).toHaveLength(1)
|
|
174
|
-
expect(zoomed[0][0]).toMatchObject({"properties": {
|
|
175
|
-
"code": "03",
|
|
176
|
-
"nom": "Allier",
|
|
177
|
-
}})
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
it('adds a class to a feature upon click', async () => {
|
|
181
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
182
|
-
await feature.trigger('click')
|
|
183
|
-
const updatedFeature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
184
|
-
expect(updatedFeature.classes('choropleth-map__main__features__item--zoomed')).toBeTruthy()
|
|
185
|
-
expect(wrapper.emitted("zoomed")).toHaveLength(1)
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
it('removes a class from a feature on the second click', async () => {
|
|
189
|
-
|
|
190
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
191
|
-
await feature.trigger('click')
|
|
192
|
-
await feature.trigger('click')
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
expect(wrapper.emitted("click")).toHaveLength(2)
|
|
196
|
-
expect(wrapper.emitted("zoomed")).toHaveLength(1)
|
|
197
|
-
expect(feature.classes('choropleth-map__main__features__item--zoomed')).toBeFalsy()
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
it('adds a class to the map upon click on a feature', async () => {
|
|
201
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
202
|
-
await feature.trigger('click')
|
|
203
|
-
expect(wrapper.classes('choropleth-map--has-zoom')).toBeTruthy()
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
it('removes a class from the map on the second click', async () => {
|
|
207
|
-
const feature = wrapper.find('.choropleth-map__main__features__item--identifier-03')
|
|
208
|
-
await feature.trigger('click')
|
|
209
|
-
await feature.trigger('click')
|
|
210
|
-
await wrapper.vm.$nextTick()
|
|
211
|
-
expect(wrapper.classes('choropleth-map--has-zoom')).toBeFalsy()
|
|
212
|
-
})
|
|
213
|
-
})
|
|
214
|
-
})
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import {describe, expect, it} from 'vitest'
|
|
2
|
-
import {shallowMount} from '@vue/test-utils'
|
|
3
|
-
|
|
4
|
-
import {default as ChoroplethMapAnnotation, PLACEMENTS} from '@/maps/ChoroplethMapAnnotation.vue'
|
|
5
|
-
import type {ParentMap, ParentMapProvide} from "@/types.js";
|
|
6
|
-
import {ParentKey} from "@/keys.js";
|
|
7
|
-
import {computed} from 'vue';
|
|
8
|
-
import {geoRobinson} from 'd3-geo-projection'
|
|
9
|
-
import {GeoProjection} from 'd3-geo';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
describe('ChoroplethMapAnnotation', () => {
|
|
13
|
-
|
|
14
|
-
const generateParentMock = ({rX = 0, rY = 0, width = 500, height = 500, k = 1}) => (
|
|
15
|
-
{
|
|
16
|
-
rotatingMapProjection: computed((): GeoProjection | Function => {
|
|
17
|
-
if (rX && rY) {
|
|
18
|
-
return () => [rX, rY]
|
|
19
|
-
}
|
|
20
|
-
return geoRobinson()
|
|
21
|
-
}),
|
|
22
|
-
mapTransform: computed(() => ({k, x: 0, y: 0, rotateX: 0, rotateY: 0})),
|
|
23
|
-
mapRect: computed(() => new DOMRect(0, 0, width, height))
|
|
24
|
-
}
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
it('renders with default props', () => {
|
|
28
|
-
const mockParentMap: ParentMap = generateParentMock({})
|
|
29
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
30
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
31
|
-
propsData: {
|
|
32
|
-
latitude: 0,
|
|
33
|
-
longitude: 0
|
|
34
|
-
},
|
|
35
|
-
global: {provide}
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
expect(wrapper.exists()).toBe(true)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('computes position correctly', () => {
|
|
42
|
-
const mockParentMap: ParentMap = generateParentMock({rX: 100, rY: 200, k: 1, width: 500, height: 500})
|
|
43
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
44
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
45
|
-
propsData: {
|
|
46
|
-
latitude: 10,
|
|
47
|
-
longitude: 20
|
|
48
|
-
},
|
|
49
|
-
global: {provide}
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
expect(wrapper.vm.x).toEqual(100)
|
|
53
|
-
expect(wrapper.vm.y).toEqual(200)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('placements', () => {
|
|
57
|
-
const mockParentMap: ParentMap = generateParentMock({})
|
|
58
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
59
|
-
const testPlacement = (placement, expectedResults) => {
|
|
60
|
-
it(`computes placement correctly for ${placement}`, () => {
|
|
61
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
62
|
-
propsData: {
|
|
63
|
-
latitude: 0,
|
|
64
|
-
longitude: 0,
|
|
65
|
-
placement
|
|
66
|
-
},
|
|
67
|
-
global: {provide}
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
expect(wrapper.vm.isRight).toBe(!!expectedResults.isRight)
|
|
71
|
-
expect(wrapper.vm.isLeft).toBe(!!expectedResults.isLeft)
|
|
72
|
-
expect(wrapper.vm.isTop).toBe(!!expectedResults.isTop)
|
|
73
|
-
expect(wrapper.vm.isBottom).toBe(!!expectedResults.isBottom)
|
|
74
|
-
expect(wrapper.vm.isCenter).toBe(!!expectedResults.isCenter)
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
testPlacement(PLACEMENTS.TOP, {isTop: true})
|
|
79
|
-
testPlacement(PLACEMENTS.TOPLEFT, {isLeft: true, isTop: true})
|
|
80
|
-
testPlacement(PLACEMENTS.TOPRIGHT, {isRight: true, isTop: true})
|
|
81
|
-
testPlacement(PLACEMENTS.RIGHT, {isRight: true})
|
|
82
|
-
testPlacement(PLACEMENTS.RIGHTTOP, {isRight: true, isTop: true})
|
|
83
|
-
testPlacement(PLACEMENTS.RIGHTBOTTOM, {isRight: true, isBottom: true})
|
|
84
|
-
testPlacement(PLACEMENTS.BOTTOM, {isBottom: true})
|
|
85
|
-
testPlacement(PLACEMENTS.BOTTOMLEFT, {isLeft: true, isBottom: true})
|
|
86
|
-
testPlacement(PLACEMENTS.BOTTOMRIGHT, {isRight: true, isBottom: true})
|
|
87
|
-
testPlacement(PLACEMENTS.LEFT, {isLeft: true})
|
|
88
|
-
testPlacement(PLACEMENTS.LEFTTOP, {isLeft: true, isTop: true})
|
|
89
|
-
testPlacement(PLACEMENTS.LEFTBOTTOM, {isLeft: true, isBottom: true})
|
|
90
|
-
testPlacement(null, {isCenter: true})
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
describe('wrapperTransformOrigin', () => {
|
|
94
|
-
const mockParentMap: ParentMap = generateParentMock({})
|
|
95
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
96
|
-
const testTransformOrigin = (placement: string, expectedX: string, expectedY: string) => {
|
|
97
|
-
it(`computes wrapperTransformOrigin correctly for ${placement}`, () => {
|
|
98
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
99
|
-
propsData: {
|
|
100
|
-
latitude: 0,
|
|
101
|
-
longitude: 0,
|
|
102
|
-
placement
|
|
103
|
-
},
|
|
104
|
-
global: {provide}
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
expect(wrapper.vm.wrapperTransformOriginX).toBe(expectedX)
|
|
108
|
-
expect(wrapper.vm.wrapperTransformOriginY).toBe(expectedY)
|
|
109
|
-
expect(wrapper.vm.wrapperTransformOrigin).toBe(`${expectedX} ${expectedY}`)
|
|
110
|
-
})
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
testTransformOrigin(PLACEMENTS.TOP, 'center', 'bottom')
|
|
114
|
-
testTransformOrigin(PLACEMENTS.TOPLEFT, 'right', 'bottom')
|
|
115
|
-
testTransformOrigin(PLACEMENTS.TOPRIGHT, 'left', 'bottom')
|
|
116
|
-
testTransformOrigin(PLACEMENTS.RIGHT, 'left', 'center')
|
|
117
|
-
testTransformOrigin(PLACEMENTS.RIGHTTOP, 'left', 'bottom')
|
|
118
|
-
testTransformOrigin(PLACEMENTS.RIGHTBOTTOM, 'left', 'top')
|
|
119
|
-
testTransformOrigin(PLACEMENTS.BOTTOM, 'center', 'top')
|
|
120
|
-
testTransformOrigin(PLACEMENTS.BOTTOMLEFT, 'right', 'top')
|
|
121
|
-
testTransformOrigin(PLACEMENTS.BOTTOMRIGHT, 'left', 'top')
|
|
122
|
-
testTransformOrigin(PLACEMENTS.LEFT, 'right', 'center')
|
|
123
|
-
testTransformOrigin(PLACEMENTS.LEFTTOP, 'right', 'bottom')
|
|
124
|
-
testTransformOrigin(PLACEMENTS.LEFTBOTTOM, 'right', 'top')
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
describe('transform', () => {
|
|
128
|
-
|
|
129
|
-
const mockParentMap: ParentMap = generateParentMock({rX: 100, rY: 200, k: 1, width: 500, height: 500})
|
|
130
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
131
|
-
const mountComponentWithProps = (propsData: any) => {
|
|
132
|
-
return shallowMount(ChoroplethMapAnnotation, {
|
|
133
|
-
propsData,
|
|
134
|
-
global: {provide}
|
|
135
|
-
})
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const testCases = [
|
|
139
|
-
{placement: PLACEMENTS.TOP, height: 150, width: 150, translateX: -75, translateY: -150},
|
|
140
|
-
{placement: PLACEMENTS.BOTTOM, height: 100, width: 200, translateX: -100, translateY: 0},
|
|
141
|
-
{placement: PLACEMENTS.LEFT, height: 200, width: 100, translateX: -100, translateY: -100},
|
|
142
|
-
{placement: PLACEMENTS.RIGHT, height: 150, width: 250, translateX: 0, translateY: -75}
|
|
143
|
-
]
|
|
144
|
-
|
|
145
|
-
testCases.forEach(({placement, height, width, translateX, translateY}) => {
|
|
146
|
-
it(`computes transform correctly for placement ${placement} with height ${height} and width ${width}`, () => {
|
|
147
|
-
const wrapper = mountComponentWithProps({latitude: 0, longitude: 0, height, width, placement})
|
|
148
|
-
|
|
149
|
-
expect(wrapper.vm.translateX).toBe(translateX)
|
|
150
|
-
expect(wrapper.vm.translateY).toBe(translateY)
|
|
151
|
-
expect(wrapper.vm.transform).toBe(`translate(${translateX}, ${translateY})`)
|
|
152
|
-
})
|
|
153
|
-
})
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
describe('isVisible', () => {
|
|
157
|
-
it('is visible when within geoDistanceThreshold', () => {
|
|
158
|
-
|
|
159
|
-
const mockParentMap: ParentMap = generateParentMock({})
|
|
160
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
161
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
162
|
-
propsData: {
|
|
163
|
-
latitude: 10,
|
|
164
|
-
longitude: 0
|
|
165
|
-
},
|
|
166
|
-
global: {provide}
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
expect(wrapper.vm.isVisible).toBeTruthy()
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
it('is not visible when outside geoDistanceThreshold', () => {
|
|
173
|
-
|
|
174
|
-
const mockParentMap: ParentMap = generateParentMock({rX: 500, rY: 0})
|
|
175
|
-
const provide: ParentMapProvide = {[ParentKey]: mockParentMap}
|
|
176
|
-
const wrapper = shallowMount(ChoroplethMapAnnotation, {
|
|
177
|
-
propsData: {
|
|
178
|
-
latitude: 0,
|
|
179
|
-
longitude: 90,
|
|
180
|
-
},
|
|
181
|
-
global: {provide}
|
|
182
|
-
})
|
|
183
|
-
expect(wrapper.vm.isVisible).toBeFalsy()
|
|
184
|
-
})
|
|
185
|
-
})
|
|
186
|
-
})
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'fs'
|
|
2
|
-
import { join, resolve } from 'path'
|
|
3
|
-
import { shallowMount,flushPromises } from '@vue/test-utils'
|
|
4
|
-
import SymbolMap from '@/maps/SymbolMap.vue'
|
|
5
|
-
|
|
6
|
-
vi.mock('d3', async () => {
|
|
7
|
-
return {
|
|
8
|
-
...await vi.importActual('d3'),
|
|
9
|
-
json: async url => {
|
|
10
|
-
const pathname = url.split('https://icij.github.io/murmur/').pop()
|
|
11
|
-
const abspath = resolve(__dirname, join('../../../public', pathname))
|
|
12
|
-
const raw = await fs.readFile(abspath, 'UTF-8')
|
|
13
|
-
return JSON.parse(raw)
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
describe('SymbolMap.vue', () => {
|
|
19
|
-
|
|
20
|
-
describe('a map of the world', () => {
|
|
21
|
-
|
|
22
|
-
let wrapper
|
|
23
|
-
|
|
24
|
-
beforeEach(async () => {
|
|
25
|
-
const propsData = {
|
|
26
|
-
hideTooltip: true,
|
|
27
|
-
data: [
|
|
28
|
-
{ id: 1, latitude: 48.859116, longitude: 2.331839, color: '#6e40aa', category: 'TECH', label: 'Paris, France' },
|
|
29
|
-
{ id: 2, latitude: -34.035875, longitude: 151.194191, color: '#ff5e63', category: 'FINANCE', label: 'Sydney, Australia' },
|
|
30
|
-
{ id: 3, latitude: 38.9072, longitude: -77.0369, color: '#aff05b', category: 'EDITO', label: 'Washington DC, USA' }
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
wrapper = shallowMount(SymbolMap, { propsData })
|
|
34
|
-
wrapper.vm.$refs.el.style.width = '500px'
|
|
35
|
-
await wrapper.vm.loadTopojson()
|
|
36
|
-
await wrapper.vm.$nextTick()
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('is a Vue instance', () => {
|
|
40
|
-
expect(wrapper.vm).toBeTruthy()
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('has a marker in the tech category', () => {
|
|
44
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-tech path')
|
|
45
|
-
const { nodeValue: fill } = feature.wrapperElement.getAttributeNode('fill')
|
|
46
|
-
expect(fill).toBe('#6e40aa')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('activates the cursor when mouse is over a marker', async () => {
|
|
50
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-tech path')
|
|
51
|
-
await feature.trigger("mouseover")
|
|
52
|
-
expect(wrapper.vm.markerCursor).toBe(1)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('has a marker in the finance category', () => {
|
|
56
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-finance path')
|
|
57
|
-
const { nodeValue: fill } = feature.element.getAttributeNode('fill')
|
|
58
|
-
expect(fill).toBe('#ff5e63')
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('activates the cursor when mouse is over a marker', async () => {
|
|
62
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-finance path')
|
|
63
|
-
await feature.trigger("mouseover")
|
|
64
|
-
expect(wrapper.vm.markerCursor).toBe(2)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('deactivates the cursor when mouse leaves a marker', async () => {
|
|
68
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-edito path')
|
|
69
|
-
await feature.trigger("mouseover")
|
|
70
|
-
expect(wrapper.vm.markerCursor).toBe(3)
|
|
71
|
-
|
|
72
|
-
await feature.trigger("mouseleave")
|
|
73
|
-
expect(wrapper.vm.markerCursor).toBe(null)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('set a class to the component when a cursor is active', async () => {
|
|
77
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-tech path')
|
|
78
|
-
await feature.trigger("mouseover")
|
|
79
|
-
expect(wrapper.classes('symbol-map--has-cursor')).toBeTruthy()
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('remove the class to the component when a cursor is removed', async () => {
|
|
83
|
-
const feature = wrapper.find('.symbol-map__main__markers__item--category-finance path')
|
|
84
|
-
await feature.trigger("mouseover")
|
|
85
|
-
expect(wrapper.vm.markerCursor).toBe(2)
|
|
86
|
-
|
|
87
|
-
expect(wrapper.classes('symbol-map--has-cursor')).toBeTruthy()
|
|
88
|
-
await feature.trigger("mouseleave")
|
|
89
|
-
expect(wrapper.classes('symbol-map--has-cursor')).toBeFalsy()
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
})
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import Murmur from '@/main'
|
|
2
|
-
|
|
3
|
-
describe('the library bundle', () => {
|
|
4
|
-
|
|
5
|
-
it('should have a list of component', () => {
|
|
6
|
-
expect(Murmur.components).toHaveProperty('Brand')
|
|
7
|
-
expect(Murmur.components).toHaveProperty('ContentPlaceholder')
|
|
8
|
-
expect(Murmur.components).toHaveProperty('DonateForm')
|
|
9
|
-
expect(Murmur.components).toHaveProperty('EmbeddableFooter')
|
|
10
|
-
expect(Murmur.components).toHaveProperty('EmbedForm')
|
|
11
|
-
expect(Murmur.components).toHaveProperty('FollowUsPopover')
|
|
12
|
-
expect(Murmur.components).toHaveProperty('Fa')
|
|
13
|
-
expect(Murmur.components).toHaveProperty('GenericFooter')
|
|
14
|
-
expect(Murmur.components).toHaveProperty('GenericHeader')
|
|
15
|
-
expect(Murmur.components).toHaveProperty('ImddbHeader')
|
|
16
|
-
expect(Murmur.components).toHaveProperty('ResponsiveIframe')
|
|
17
|
-
expect(Murmur.components).toHaveProperty('SharingOptions')
|
|
18
|
-
expect(Murmur.components).toHaveProperty('SignUpForm')
|
|
19
|
-
expect(Murmur.components).toHaveProperty('SlideUpDown')
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
})
|
package/tests/unit/setup.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { config } from '@vue/test-utils';
|
|
2
|
-
import {i18n} from "../../lib/i18n";
|
|
3
|
-
import createBootstrap from "bootstrap-vue-next";
|
|
4
|
-
|
|
5
|
-
// @ts-expect-error type
|
|
6
|
-
config.global.plugins = [i18n,createBootstrap()];
|
|
7
|
-
// @ts-expect-error type
|
|
8
|
-
Object.defineProperty(document, 'fonts', {
|
|
9
|
-
value: { ready: Promise.resolve({}) },
|
|
10
|
-
})
|
|
11
|
-
global.HTMLCanvasElement.prototype.getContext = () => null;
|
|
12
|
-
global.HTMLCanvasElement.prototype.toDataURL = () => null;
|
|
13
|
-
global.URL.createObjectURL = () => "";
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { injectAsset, injectAssets } from '@/utils/assets'
|
|
2
|
-
|
|
3
|
-
describe('assets.js', () => {
|
|
4
|
-
|
|
5
|
-
it('should define a script form Pym with a specify id', () => {
|
|
6
|
-
expect(window.pym).toBeUndefined()
|
|
7
|
-
injectAsset("https://pym.nprapps.org/pym.v1.min.js", "pym-js")
|
|
8
|
-
expect(document.querySelectorAll('#pym-js').length).toBe(1)
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
it('should define a script form Pym with a specify id only once', () => {
|
|
12
|
-
expect(window.pym).toBeUndefined()
|
|
13
|
-
injectAsset("https://pym.nprapps.org/pym.v1.min.js", "pym-js")
|
|
14
|
-
injectAsset("https://pym.nprapps.org/pym.v1.min.js", "pym-js")
|
|
15
|
-
expect(document.querySelectorAll('#pym-js').length).toBe(1)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('should define a script form Pym once', () => {
|
|
19
|
-
expect(window.pym).toBeUndefined()
|
|
20
|
-
injectAsset("https://pym.nprapps.org/pym.v1.min.js")
|
|
21
|
-
expect(document.querySelectorAll('script[src="https://pym.nprapps.org/pym.v1.min.js"]').length).toBe(1)
|
|
22
|
-
injectAsset("https://pym.nprapps.org/pym.v1.min.js")
|
|
23
|
-
expect(document.querySelectorAll('script[src="https://pym.nprapps.org/pym.v1.min.js"]').length).toBe(1)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('should define a script form Pym once, even if we pass an array with duplicates', () => {
|
|
27
|
-
injectAssets([
|
|
28
|
-
"https://pym.nprapps.org/pym.v1.min.js",
|
|
29
|
-
"https://pym.nprapps.org/pym.v1.min.js"
|
|
30
|
-
])
|
|
31
|
-
expect(document.querySelectorAll('script[src="https://pym.nprapps.org/pym.v1.min.js"]').length).toBe(1)
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
it('should define two scripts', () => {
|
|
35
|
-
injectAssets([
|
|
36
|
-
"https://pym.nprapps.org/pym.v1.min.js",
|
|
37
|
-
"https://pym.nprapps.org/pym.v1.js"
|
|
38
|
-
])
|
|
39
|
-
|
|
40
|
-
expect(document.querySelectorAll('script[src^="https://pym.nprapps.org/pym.v1"]').length).toBe(2)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('should define two stylesheets', () => {
|
|
44
|
-
injectAssets([
|
|
45
|
-
"https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
|
|
46
|
-
"https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.css"
|
|
47
|
-
])
|
|
48
|
-
|
|
49
|
-
expect(document.querySelectorAll('link[rel=stylesheet]').length).toBe(2)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('should define two stylesheets, even with duplicates', () => {
|
|
53
|
-
injectAssets([
|
|
54
|
-
"https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css",
|
|
55
|
-
"https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.css",
|
|
56
|
-
"https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.css"
|
|
57
|
-
])
|
|
58
|
-
|
|
59
|
-
expect(document.querySelectorAll('link[rel=stylesheet]').length).toBe(2)
|
|
60
|
-
})
|
|
61
|
-
})
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import noop from 'lodash/noop'
|
|
2
|
-
import { copyText } from '@/utils/clipboard'
|
|
3
|
-
|
|
4
|
-
describe('clipboard.js', () => {
|
|
5
|
-
|
|
6
|
-
it('should return a Promise', () => {
|
|
7
|
-
const promise = copyText('uwu').catch(noop)
|
|
8
|
-
expect(promise).toBeInstanceOf(Promise)
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
it('should reject the promise', async () => {
|
|
12
|
-
try {
|
|
13
|
-
await copyText('uwu')
|
|
14
|
-
} catch(error) {
|
|
15
|
-
expect(error.text).toBe('uwu')
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
})
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import startsWith from 'lodash/startsWith'
|
|
2
|
-
import IframeResizer from '@/utils/iframe-resizer'
|
|
3
|
-
|
|
4
|
-
describe('iframe-resizer.ts', () => {
|
|
5
|
-
|
|
6
|
-
it('should define a `create` static method', () => {
|
|
7
|
-
expect(IframeResizer.create).toBeDefined()
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
it('should create an IframeResizer instance from a singleton', () => {
|
|
11
|
-
const first = IframeResizer.create()
|
|
12
|
-
const second = IframeResizer.create()
|
|
13
|
-
expect(first).toEqual(second)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
it('should return a promise from the `sendHeight` method', () => {
|
|
17
|
-
const resizer = IframeResizer.create()
|
|
18
|
-
expect(resizer.sendHeight()).toBeInstanceOf(Promise)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('should define a `template` static method', () => {
|
|
22
|
-
expect(IframeResizer.template).toBeDefined()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('should return a script tag as template', () => {
|
|
26
|
-
expect(startsWith(IframeResizer.template(), '<script ')).toBeTruthy()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('should return a script tag as template with a custom id', () => {
|
|
30
|
-
const template = IframeResizer.template(window.location.href, 'uwu')
|
|
31
|
-
expect(startsWith(template, '<script ')).toBeTruthy()
|
|
32
|
-
expect(template.includes('id="uwu"')).toBeTruthy()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('should define a `deletePymParams` static method', () => {
|
|
36
|
-
expect(IframeResizer.deletePymParams).toBeDefined()
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
it('should delete Pym\'s params from the given location', () => {
|
|
40
|
-
const url = 'https://projects.icij.org/?initialWidth=720&childId=example-graphic'
|
|
41
|
-
expect(IframeResizer.deletePymParams(url)).toBe('https://projects.icij.org/')
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('should delete Pym\'s params from the other given location', () => {
|
|
45
|
-
const url = 'https://projects.icij.org/test/?initialWidth=720'
|
|
46
|
-
expect(IframeResizer.deletePymParams(url)).toBe('https://projects.icij.org/test/')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('shouldn\'t delete Pym\'s params from given location because there is none', () => {
|
|
50
|
-
const url = 'https://projects.icij.org/test/?initial=720'
|
|
51
|
-
expect(IframeResizer.deletePymParams(url)).toBe(url)
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
it('should define a `isEmbedded` static method', () => {
|
|
55
|
-
expect(IframeResizer.isEmbedded).toBeDefined()
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('should say the current location is not embedded', () => {
|
|
59
|
-
expect(IframeResizer.isEmbedded()).toBeFalsy()
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('should say the given location is not embedded', () => {
|
|
63
|
-
const url = 'https://projects.icij.org/'
|
|
64
|
-
expect(IframeResizer.isEmbedded(url)).toBeFalsy()
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('should say the given location is embedded', () => {
|
|
68
|
-
const url = 'https://projects.icij.org/?initialWidth=720&childId=example-graphic'
|
|
69
|
-
expect(IframeResizer.isEmbedded(url)).toBeFalsy()
|
|
70
|
-
})
|
|
71
|
-
})
|