11import { beforeEach , describe , expect , it , vi } from "vitest" ;
22import { shallowMount } from "@vue/test-utils" ;
3+ import { ref } from "vue" ;
34
45import AdvancedSearch from "@/components/Records/Search/Input/AdvancedSearch/AdvancedSearch.vue" ;
56
7+ // 1. Setup reactive references we can alter dynamically inside individual tests
8+ const mockXl = ref ( false ) ;
9+ const mockMdAndDown = ref ( false ) ;
10+
11+ // 2. Mock 'useDisplay' from Vuetify directly to control composition API output
12+ vi . mock ( "vuetify" , async ( importOriginal ) => {
13+ const original = await importOriginal ( ) ;
14+ return {
15+ ...original ,
16+ useDisplay : ( ) => ( {
17+ xl : mockXl ,
18+ mdAndDown : mockMdAndDown ,
19+ } ) ,
20+ } ;
21+ } ) ;
22+
23+ // 3. Mock the Vuex store commit tracking via hoisted architecture
624const { mockCommit } = vi . hoisted ( ( ) => {
725 return { mockCommit : vi . fn ( ) } ;
826} ) ;
@@ -14,22 +32,21 @@ vi.mock("@/store", () => ({
1432
1533describe ( "AdvancedSearch.vue" , ( ) => {
1634 let wrapper ;
17- const createWrapper = ( props = { } , displayMock = { } ) => {
35+
36+ const createWrapper = ( props = { } ) => {
1837 return shallowMount ( AdvancedSearch , {
1938 props,
2039 global : {
2140 mocks : {
22- $vuetify : {
23- display : {
24- lgAndDown : false ,
25- xl : false ,
26- mdAndDown : false ,
27- ...displayMock , // Override defaults with specific test cases
28- } ,
41+ // Keep fallback store binding if component pulls globally outside Vuex plugin mapping
42+ $store : {
43+ commit : mockCommit ,
2944 } ,
3045 } ,
3146 stubs : {
32- "v-btn" : true ,
47+ "v-btn" : {
48+ template : '<button class="v-btn-stub"><slot /></button>' ,
49+ } ,
3350 "v-icon" : true ,
3451 AdvancedSearchDialogBox : true ,
3552 } ,
@@ -39,64 +56,73 @@ describe("AdvancedSearch.vue", () => {
3956
4057 beforeEach ( ( ) => {
4158 mockCommit . mockClear ( ) ;
59+ // Reset reactive display behaviors back to default states
60+ mockXl . value = false ;
61+ mockMdAndDown . value = false ;
4262 } ) ;
4363
44- describe ( "Responsive Vuetify Classes and Sizes" , ( ) => {
45- it ( "applies 'advancedTextXl' and 'x-large' size when showHomeSearch is false AND xl is true" , ( ) => {
46- wrapper = createWrapper (
47- { showHomeSearch : false } ,
48- { xl : true , mdAndDown : false } ,
49- ) ;
50- const btn = wrapper . findComponent ( { name : "v-btn" } ) ;
64+ describe ( "Responsive Vuetify Sizes" , ( ) => {
65+ it ( "applies 'x-large' size when showHomeSearch is false AND xl display is true" , async ( ) => {
66+ mockXl . value = true ;
67+ mockMdAndDown . value = false ;
68+
69+ wrapper = createWrapper ( { showHomeSearch : false } ) ;
70+ await wrapper . vm . $nextTick ( ) ;
71+
72+ const btn = wrapper . find ( ".v-btn-stub" ) ;
5173
52- expect ( btn . classes ( ) ) . toContain ( "advancedTextXl" ) ;
5374 expect ( btn . attributes ( "size" ) ) . toBe ( "x-large" ) ;
75+ expect ( btn . classes ( ) ) . toContain ( "advanced-header-btn" ) ;
5476 } ) ;
5577
56- it ( "applies 'advancedTextMd' and 'large' size when showHomeSearch is false AND mdAndDown is true" , ( ) => {
57- wrapper = createWrapper (
58- { showHomeSearch : false } ,
59- { xl : false , mdAndDown : true } ,
60- ) ;
61- const btn = wrapper . findComponent ( { name : "v-btn" } ) ;
78+ it ( "applies 'large' size when showHomeSearch is false AND mdAndDown display is true" , async ( ) => {
79+ mockXl . value = false ;
80+ mockMdAndDown . value = true ;
81+
82+ wrapper = createWrapper ( { showHomeSearch : false } ) ;
83+
84+ // Wait for the mounted() hook data mutation (isMounted = true) to re-render the DOM template updates
85+ await wrapper . vm . $nextTick ( ) ;
86+
87+ const btn = wrapper . find ( ".v-btn-stub" ) ;
6288
63- expect ( btn . classes ( ) ) . toContain ( "advancedTextMd" ) ;
6489 expect ( btn . attributes ( "size" ) ) . toBe ( "large" ) ;
90+ expect ( btn . classes ( ) ) . toContain ( "advanced-header-btn" ) ;
6591 } ) ;
6692 } ) ;
6793
6894 describe ( "Methods and Store Commits" , ( ) => {
69- it ( "triggers openAdvanceSearch when the Home Search (first) button is clicked" , async ( ) => {
70- const wrapper = createWrapper ( { showHomeSearch : true } ) ;
71- const firstBtn = wrapper . findComponent ( { name : "v-btn" } ) ;
72- expect ( firstBtn . classes ( ) ) . toContain ( "px-6" ) ;
73- await firstBtn . trigger ( "click" ) ;
95+ it ( "triggers openAdvanceSearch when the Home Search button is clicked" , async ( ) => {
96+ wrapper = createWrapper ( { showHomeSearch : true } ) ;
97+ const homeBtn = wrapper . find ( ".v-btn-stub" ) ;
98+
99+ expect ( homeBtn . classes ( ) ) . toContain ( "home-search-btn" ) ;
100+ await homeBtn . trigger ( "click" ) ;
74101
75- // 4. Assert our hoisted store mock was called correctly!
76102 expect ( mockCommit ) . toHaveBeenCalledOnce ( ) ;
77103 expect ( mockCommit ) . toHaveBeenCalledWith (
78104 "advancedSearch/setAdvancedSearchDialogStatus" ,
79105 true ,
80106 ) ;
81107 } ) ;
82- it ( "commits to the advancedSearch store when openAdvanceSearch is called" , ( ) => {
108+
109+ it ( "commits to the advancedSearch store when openAdvanceSearch is executed manually" , ( ) => {
83110 wrapper = createWrapper ( ) ;
84111
85- // Trigger the method
86112 wrapper . vm . openAdvanceSearch ( ) ;
87113
88- // 4. Assert directly against the standalone spy!
89114 expect ( mockCommit ) . toHaveBeenCalledOnce ( ) ;
90115 expect ( mockCommit ) . toHaveBeenCalledWith (
91116 "advancedSearch/setAdvancedSearchDialogStatus" ,
92117 true ,
93118 ) ;
94119 } ) ;
95120
96- it ( "triggers openAdvanceSearch when the button is clicked" , async ( ) => {
97- wrapper = createWrapper ( ) ;
98- const btn = wrapper . findComponent ( { name : "v-btn" } ) ;
99- await btn . trigger ( "click" ) ;
121+ it ( "triggers openAdvanceSearch when the header style button is clicked" , async ( ) => {
122+ wrapper = createWrapper ( { showHomeSearch : false } ) ;
123+ const headerBtn = wrapper . find ( ".v-btn-stub" ) ;
124+
125+ await headerBtn . trigger ( "click" ) ;
100126 expect ( mockCommit ) . toHaveBeenCalledOnce ( ) ;
101127 } ) ;
102128 } ) ;
0 commit comments