- Migrate from "Vue 2.X" to "Vue 3.X"
- Migrate from "Vue Test Utils v1" to "Vue Test Utils v2"
Changes in detail:
- Change `inserted` to `mounted`.
- Change `::v-deep` to `:deep`.
- Change to Vue 3.0 `v-modal` syntax.
- Remove old Vue 2.0 transition name, keep the ones for Vue 3.0.
- Use new global mounting API `createApp`.
- Change `destroy` to `unmount`.
- Bootstrapping:
- Move `provide`s for global dependencies to a bootsrapper from
`App.vue`.
- Remove `productionTip` setting (not in Vue 3).
- Change `IVueBootstrapper` for simplicity and Vue 3 compatible API.
- Add missing tests.
- Remove `.text` access on `VNode` as it's now internal API of Vue.
- Import `CSSProperties` from `vue` instead of `jsx` package.
- Shims:
- Remove unused `shims-tsx.d.ts`.
- Remove `shims-vue.d.ts` that's missing in quickstart template.
- Unit tests:
- Remove old typing workaround for mounting components.
- Rename `propsData` to `props`.
- Remove unneeded `any` cast workarounds.
- Move stubs and `provide`s under `global` object.
Other changes:
- Add `dmg-license` dependency explicitly due to failing electron builds
on macOS (electron-userland/electron-builder#6520,
electron-userland/electron-builder#6489). This was a side-effect of
updating dependencies for this commit.
78 lines
2.9 KiB
TypeScript
78 lines
2.9 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { shallowMount } from '@vue/test-utils';
|
|
import { useSelectedScriptNodeIds } from '@/presentation/components/Scripts/View/Tree/TreeViewAdapter/UseSelectedScriptNodeIds';
|
|
import { InjectionKeys } from '@/presentation/injectionSymbols';
|
|
import { UseAutoUnsubscribedEventsStub } from '@tests/unit/shared/Stubs/UseAutoUnsubscribedEventsStub';
|
|
import { UseCollectionStateStub } from '@tests/unit/shared/Stubs/UseCollectionStateStub';
|
|
import { CategoryCollectionStateStub } from '@tests/unit/shared/Stubs/CategoryCollectionStateStub';
|
|
import { SelectedScriptStub } from '@tests/unit/shared/Stubs/SelectedScriptStub';
|
|
import { getScriptNodeId } from '@/presentation/components/Scripts/View/Tree/TreeViewAdapter/CategoryNodeMetadataConverter';
|
|
import { IScript } from '@/domain/IScript';
|
|
|
|
describe('useSelectedScriptNodeIds', () => {
|
|
it('returns empty array when no scripts are selected', () => {
|
|
// arrange
|
|
const { useStateStub, returnObject } = mountWrapperComponent();
|
|
useStateStub.withState(new CategoryCollectionStateStub().withSelectedScripts([]));
|
|
// act
|
|
const actualIds = returnObject.selectedScriptNodeIds.value;
|
|
// assert
|
|
expect(actualIds).to.have.lengthOf(0);
|
|
});
|
|
|
|
it('returns correct node IDs for selected scripts', () => {
|
|
// arrange
|
|
const selectedScripts = [
|
|
new SelectedScriptStub('id-1'),
|
|
new SelectedScriptStub('id-2'),
|
|
];
|
|
const parsedNodeIds = new Map<IScript, string>([
|
|
[selectedScripts[0].script, 'expected-id-1'],
|
|
[selectedScripts[1].script, 'expected-id-1'],
|
|
]);
|
|
const { useStateStub, returnObject } = mountWrapperComponent({
|
|
scriptNodeIdParser: (script) => parsedNodeIds.get(script),
|
|
});
|
|
useStateStub.triggerOnStateChange({
|
|
newState: new CategoryCollectionStateStub().withSelectedScripts(selectedScripts),
|
|
immediateOnly: true,
|
|
});
|
|
// act
|
|
const actualIds = returnObject.selectedScriptNodeIds.value;
|
|
// assert
|
|
const expectedNodeIds = [...parsedNodeIds.values()];
|
|
expect(actualIds).to.have.lengthOf(expectedNodeIds.length);
|
|
expect(actualIds).to.include.members(expectedNodeIds);
|
|
});
|
|
});
|
|
|
|
function mountWrapperComponent(scenario?: {
|
|
readonly scriptNodeIdParser?: typeof getScriptNodeId,
|
|
}) {
|
|
const useStateStub = new UseCollectionStateStub();
|
|
const nodeIdParser: typeof getScriptNodeId = scenario?.scriptNodeIdParser
|
|
?? ((script) => script.id);
|
|
let returnObject: ReturnType<typeof useSelectedScriptNodeIds>;
|
|
|
|
shallowMount({
|
|
setup() {
|
|
returnObject = useSelectedScriptNodeIds(nodeIdParser);
|
|
},
|
|
template: '<div></div>',
|
|
}, {
|
|
global: {
|
|
provide: {
|
|
[InjectionKeys.useCollectionState as symbol]:
|
|
() => useStateStub.get(),
|
|
[InjectionKeys.useAutoUnsubscribedEvents as symbol]:
|
|
() => new UseAutoUnsubscribedEventsStub().get(),
|
|
},
|
|
},
|
|
});
|
|
|
|
return {
|
|
returnObject,
|
|
useStateStub,
|
|
};
|
|
}
|