blob: dfeed45975e2c106af1ecbde0e73886b839ae842 [file] [log] [blame]
Jason Westover75b02032025-12-21 12:54:45 -05001/* eslint-env jest */
2import { createI18n } from 'vue-i18n';
3import { createStore } from 'vuex';
4
5// Create a minimal i18n instance for testing
6export function createTestI18n() {
7 return createI18n({
8 legacy: false,
9 locale: 'en-US',
10 fallbackLocale: 'en-US',
11 silentFallbackWarn: true,
12 messages: {
13 'en-US': {
14 global: {
15 table: { fromDate: 'From date', toDate: 'To date' },
16 form: {
17 fieldRequired: 'Field required',
18 invalidFormat: 'Invalid format',
19 dateMustBeBefore: 'Date must be before {date}',
20 dateMustBeAfter: 'Date must be after {date}',
21 lengthMustBeBetween: 'Length must be between {min} and {max}',
22 selectAnOption: 'Select an option',
23 },
24 action: {
25 cancel: 'Cancel',
26 save: 'Save',
27 add: 'Add',
28 },
29 status: {
30 enabled: 'Enabled',
31 disabled: 'Disabled',
32 },
33 },
34 pageUserManagement: {
35 addUser: 'Add user',
36 editUser: 'Edit user',
37 modal: {
38 accountLocked: 'Account locked',
39 clickSaveToUnlockAccount: 'Click save to unlock account',
40 unlock: 'Unlock',
41 accountStatus: 'Account status',
42 username: 'Username',
43 cannotStartWithANumber: 'Cannot start with a number',
44 noSpecialCharactersExceptUnderscore:
45 'No special characters except underscore',
46 privilege: 'Privilege',
47 userPassword: 'User password',
48 passwordMustBeBetween: 'Password must be between {min} and {max}',
49 confirmUserPassword: 'Confirm user password',
50 passwordsDoNotMatch: 'Passwords do not match',
51 },
52 },
53 pageNetwork: {
54 hostname: 'Hostname',
55 macAddress: 'MAC address',
56 modal: {
57 editHostnameTitle: 'Edit hostname',
58 editMacAddressTitle: 'Edit MAC address',
59 },
60 },
61 pageFactoryReset: {
62 modal: {
63 resetBiosSubmitText: 'Reset BIOS',
64 },
65 },
66 },
67 },
68 });
69}
70
71// Common Bootstrap Vue Next component stubs
72export const bootstrapStubs = {
73 'b-row': { template: '<div><slot /></div>' },
74 'b-col': { template: '<div><slot /></div>' },
75 'b-container': { template: '<div><slot /></div>' },
76 'b-form': {
77 template: '<form @submit.prevent="$emit(\'submit\')"><slot /></form>',
78 emits: ['submit'],
79 },
80 'b-form-group': { template: '<div><slot /></div>' },
81 'b-input-group': { template: '<div><slot /></div>' },
82 'b-form-input': {
83 template:
84 '<input :value="modelValue" @input="$emit(\'update:modelValue\', $event.target.value)" @blur="$emit(\'blur\')" @change="$emit(\'change\', $event.target.value)" />',
85 props: ['modelValue', 'state', 'type', 'id'],
86 emits: ['update:modelValue', 'blur', 'change', 'input'],
87 },
88 'b-form-select': {
89 template:
90 '<select :value="modelValue" @change="$emit(\'update:modelValue\', $event.target.value); $emit(\'change\', $event.target.value)"><slot /><slot name="first" /></select>',
91 props: ['modelValue', 'options', 'state'],
92 emits: ['update:modelValue', 'change'],
93 },
94 'b-form-select-option': { template: '<option><slot /></option>' },
95 'b-form-radio': {
96 template:
jason westover313d15c2025-08-18 17:16:01 -050097 '<label class="form-check"><input type="radio" :value="value" :checked="modelValue === value" @change="$emit(\'update:modelValue\', value); $emit(\'change\', value)" /><slot /></label>',
Jason Westover75b02032025-12-21 12:54:45 -050098 props: ['modelValue', 'value', 'name'],
99 emits: ['update:modelValue', 'change'],
100 },
101 'b-form-checkbox': {
102 template:
jason westover313d15c2025-08-18 17:16:01 -0500103 '<label class="form-check"><input type="checkbox" :checked="modelValue" @change="$emit(\'update:modelValue\', $event.target.checked)" /><slot /></label>',
Jason Westover75b02032025-12-21 12:54:45 -0500104 props: ['modelValue'],
105 emits: ['update:modelValue'],
106 },
107 'b-form-text': { template: '<div><slot /></div>' },
108 'b-form-invalid-feedback': { template: '<div><slot /></div>' },
109 'b-button': {
110 template: '<button @click="$emit(\'click\', $event)"><slot /></button>',
111 emits: ['click'],
112 },
113 'b-modal': {
114 template:
115 '<div v-if="modelValue"><slot></slot><slot name="footer" :cancel="() => $emit(\'update:modelValue\', false)"></slot></div>',
116 props: ['modelValue', 'title', 'id'],
117 emits: ['update:modelValue', 'hidden'],
118 methods: {
119 hide() {
120 this.$emit('update:modelValue', false);
121 this.$emit('hidden');
122 },
123 show() {
124 this.$emit('update:modelValue', true);
125 },
126 },
127 },
128};
129
130// Create common modal stub with refs
131export function createModalStub() {
132 return {
133 template:
134 '<div><slot></slot><slot name="footer" :cancel="() => {}"></slot></div>',
135 methods: {
136 hide: jest.fn(),
137 show: jest.fn(),
138 },
139 };
140}
141
142// Create a basic Vuex store for testing
143export function createTestStore(modules = {}) {
144 return createStore({
145 modules: {
146 global: {
147 namespaced: true,
148 getters: {
149 username: () => 'admin',
150 languagePreference: () => 'en-US',
151 serverStatus: () => 'on',
152 timezone: () => 'UTC',
153 },
154 ...modules.global,
155 },
156 ...modules,
157 },
158 });
159}