|
1 | | -import { useField } from '@/vee-validate'; |
| 1 | +import { useField, useForm } from '@/vee-validate'; |
2 | 2 | import { defineComponent, onMounted, ref } from 'vue'; |
3 | 3 | import { mountWithHoc, setValue, flushPromises } from './helpers'; |
4 | 4 |
|
@@ -187,6 +187,42 @@ describe('useField()', () => { |
187 | 187 | expect(meta?.textContent).toBe('clean'); |
188 | 188 | }); |
189 | 189 |
|
| 190 | + // #3891 |
| 191 | + test('dirty flag is false after reset with a new value when a form is present', async () => { |
| 192 | + mountWithHoc({ |
| 193 | + setup() { |
| 194 | + useForm(); |
| 195 | + const { value, meta, resetField } = useField('field', val => (val ? true : REQUIRED_MESSAGE)); |
| 196 | + |
| 197 | + return { |
| 198 | + value, |
| 199 | + meta, |
| 200 | + resetField, |
| 201 | + }; |
| 202 | + }, |
| 203 | + template: ` |
| 204 | + <input name="field" v-model="value" /> |
| 205 | + <span id="meta">{{ meta.dirty ? 'dirty' : 'clean' }}</span> |
| 206 | + <button @click="resetField({ value: '12' })">Reset</button> |
| 207 | + `, |
| 208 | + }); |
| 209 | + |
| 210 | + const input = document.querySelector('input') as HTMLInputElement; |
| 211 | + const meta = document.querySelector('#meta'); |
| 212 | + |
| 213 | + await flushPromises(); |
| 214 | + expect(meta?.textContent).toBe('clean'); |
| 215 | + |
| 216 | + setValue(input, ''); |
| 217 | + await flushPromises(); |
| 218 | + expect(meta?.textContent).toBe('dirty'); |
| 219 | + |
| 220 | + // trigger reset |
| 221 | + document.querySelector('button')?.click(); |
| 222 | + await flushPromises(); |
| 223 | + expect(meta?.textContent).toBe('clean'); |
| 224 | + }); |
| 225 | + |
190 | 226 | describe('has validation modes', () => { |
191 | 227 | test('silent mode does not generate messages', async () => { |
192 | 228 | let validateFn!: ReturnType<typeof useField>['validate']; |
|
0 commit comments