@@ -18,33 +18,88 @@ describe('newTopicModal', () => {
1818 beforeEach ( ( ) => {
1919 wrapper = makeWrapper ( ) ;
2020 } ) ;
21- it ( 'dialog should reflect v-model value' , async ( ) => {
22- expect ( wrapper . vm . dialog ) . toBe ( true ) ;
23- wrapper . setProps ( { value : false } ) ;
24- await wrapper . vm . $nextTick ( ) ;
25- expect ( wrapper . vm . dialog ) . toBe ( false ) ;
26- } ) ;
27- it ( 'create button should validate form' , async ( ) => {
28- wrapper . find ( '[data-test="create"]' ) . trigger ( 'click' ) ;
29- await wrapper . vm . $nextTick ( ) ;
30- expect ( wrapper . findComponent ( { ref : 'form' } ) . vm . value ) . toBe ( false ) ;
21+
22+ it ( 'renders correctly with default data' , ( ) => {
23+ expect ( wrapper . find ( '[data-test="newtopicmodal"]' ) . exists ( ) ) . toBe ( true ) ;
24+ expect ( wrapper . vm . title ) . toBe ( '' ) ;
25+ expect ( wrapper . vm . showErrorText ) . toBe ( false ) ;
26+ } ) ;
27+
28+ it ( 'displays modal with required props' , ( ) => {
29+ const modal = wrapper . findComponent ( { name : 'KModal' } ) ;
30+ expect ( modal . props ( 'title' ) ) . toBeDefined ( ) ;
31+ expect ( modal . props ( 'title' ) . length ) . toBeGreaterThan ( 0 ) ;
32+ expect ( modal . props ( 'cancelText' ) ) . toBeDefined ( ) ;
33+ expect ( modal . props ( 'submitText' ) ) . toBeDefined ( ) ;
34+ } ) ;
35+
36+ it ( 'updates title when user types in textbox' , async ( ) => {
37+ const testInput = 'Test Topic' ;
38+ const textbox = wrapper . findComponent ( { name : 'KTextbox' } ) ;
39+ await textbox . vm . $emit ( 'input' , testInput ) ;
40+ expect ( wrapper . vm . title ) . toBe ( testInput ) ;
41+ } ) ;
42+
43+ it ( 'shows error state when creating topic with empty title' , async ( ) => {
44+ wrapper . setData ( { title : '' } ) ;
45+ await wrapper . vm . create ( ) ;
46+ expect ( wrapper . vm . titleError ) . toBeDefined ( ) ;
47+ expect ( wrapper . vm . titleError . length ) . toBeGreaterThan ( 0 ) ;
48+ expect ( wrapper . vm . showErrorText ) . toBe ( true ) ;
49+ } ) ;
50+
51+ it ( 'emits createTopic event with provided title' , async ( ) => {
52+ const testTitle = 'Valid Topic Title' ;
53+ wrapper . setData ( { title : testTitle } ) ;
54+ await wrapper . vm . create ( ) ;
55+ expect ( wrapper . emitted ( 'createTopic' ) ) . toBeTruthy ( ) ;
56+ expect ( wrapper . emitted ( 'createTopic' ) [ 0 ] ) . toEqual ( [ testTitle ] ) ;
57+ } ) ;
58+
59+ it ( 'does not emit createTopic event when title is empty' , async ( ) => {
60+ wrapper . setData ( { title : '' } ) ;
61+ await wrapper . vm . create ( ) ;
3162 expect ( wrapper . emitted ( 'createTopic' ) ) . toBeFalsy ( ) ;
3263 } ) ;
33- it ( 'create button should emit createTopic event if valid' , async ( ) => {
34- wrapper . setData ( { title : 'test title' } ) ;
35- await wrapper . vm . $nextTick ( ) ;
36- wrapper . findComponent ( '[data-test="create"]' ) . trigger ( 'click' ) ;
37- await wrapper . vm . $nextTick ( ) ;
38- expect ( wrapper . emitted ( 'createTopic' ) [ 0 ] [ 0 ] ) . toBe ( 'test title' ) ;
39- } ) ;
40- it ( 'close button should emit input event with false value' , async ( ) => {
41- wrapper . findComponent ( '[data-test="close"]' ) . trigger ( 'click' ) ;
42- await wrapper . vm . $nextTick ( ) ;
43- expect ( wrapper . emitted ( 'input' ) [ 0 ] [ 0 ] ) . toBe ( false ) ;
44- } ) ;
45- it ( 'closing modal should clear title' , async ( ) => {
46- wrapper . findComponent ( '[data-test="close"]' ) . trigger ( 'click' ) ;
47- await wrapper . vm . $nextTick ( ) ;
48- expect ( wrapper . vm . title ) . toBe ( '' ) ;
64+
65+ it ( 'emits cancelCreateTopic event when cancel is called' , async ( ) => {
66+ await wrapper . vm . cancel ( ) ;
67+ expect ( wrapper . emitted ( 'cancelCreateTopic' ) ) . toBeTruthy ( ) ;
68+ } ) ;
69+
70+ it ( 'focuses title input when validation fails' , async ( ) => {
71+ const focusSpy = jest . spyOn ( wrapper . vm . $refs . title , 'focus' ) ;
72+ wrapper . setData ( { title : '' } ) ;
73+ await wrapper . vm . create ( ) ;
74+ expect ( focusSpy ) . toHaveBeenCalled ( ) ;
75+ } ) ;
76+
77+ it ( 'configures textbox with correct constraints' , ( ) => {
78+ const textbox = wrapper . findComponent ( { name : 'KTextbox' } ) ;
79+ expect ( textbox . props ( 'label' ) ) . toBeDefined ( ) ;
80+ expect ( textbox . props ( 'maxlength' ) ) . toBe ( 200 ) ;
81+ } ) ;
82+
83+ it ( 'shows invalid state on textbox when error occurs' , async ( ) => {
84+ const textbox = wrapper . findComponent ( { name : 'KTextbox' } ) ;
85+ wrapper . setData ( { title : '' } ) ;
86+ await wrapper . vm . create ( ) ;
87+ expect ( textbox . props ( 'invalid' ) ) . toBe ( true ) ;
88+ expect ( textbox . props ( 'showInvalidText' ) ) . toBe ( true ) ;
89+ expect ( textbox . props ( 'invalidText' ) ) . toBeDefined ( ) ;
90+ } ) ;
91+
92+ it ( 'clears error state when valid title is provided' , async ( ) => {
93+ // Invalid title
94+ wrapper . setData ( { title : '' } ) ;
95+ await wrapper . vm . create ( ) ;
96+ expect ( wrapper . vm . showErrorText ) . toBe ( true ) ;
97+
98+ // Valid title
99+ const validTitle = 'Valid Title' ;
100+ wrapper . setData ( { title : validTitle } ) ;
101+ await wrapper . vm . create ( ) ;
102+ expect ( wrapper . emitted ( 'createTopic' ) ) . toBeTruthy ( ) ;
103+ expect ( wrapper . emitted ( 'createTopic' ) [ 0 ] ) . toEqual ( [ validTitle ] ) ;
49104 } ) ;
50105} ) ;
0 commit comments