From 0fab3497c0f9a6791734b400ec54cab63a66f8e9 Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 16:42:32 -0300
Subject: [PATCH 1/7] chore(b-form-file): additional unit tests

---
 src/components/form-file/form-file.spec.js | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/components/form-file/form-file.spec.js b/src/components/form-file/form-file.spec.js
index fc1d1fe3d57..fd6dffe3e2f 100644
--- a/src/components/form-file/form-file.spec.js
+++ b/src/components/form-file/form-file.spec.js
@@ -232,22 +232,35 @@ describe('form-file', () => {
 
     // Emulate the files array
     wrapper.vm.setFiles(files)
+    awaitwaitNT(wrapper.vm)
     expect(wrapper.emitted('input')).toBeDefined()
     expect(wrapper.emitted('input').length).toEqual(1)
     expect(wrapper.emitted('input')[0][0]).toEqual(files)
 
     // Setting to same array of files should not emit event
     wrapper.vm.setFiles(files)
+    awaitwaitNT(wrapper.vm)
     expect(wrapper.emitted('input')).toBeDefined()
     expect(wrapper.emitted('input').length).toEqual(1)
 
     // Setting to new array of same files should not emit event
     wrapper.vm.setFiles([file1, file2])
+    awaitwaitNT(wrapper.vm)
     expect(wrapper.emitted('input').length).toEqual(1)
 
     // Setting to array of new files should emit event
     wrapper.vm.setFiles(files.slice().reverse())
+    awaitwaitNT(wrapper.vm)
     expect(wrapper.emitted('input').length).toEqual(2)
+    expect(wrapper.emitted('input')[1][0]).toEqual(files.slice().reverse())
+
+    // Internally setting `selectedFile` to `null` should emit empty array
+    wrapper.setData({
+      selectedFile: null
+    })
+    awaitwaitNT(wrapper.vm)
+    expect(wrapper.emitted('input').length).toEqual(3)
+    expect(wrapper.emitted('input')[2][0]).toEqual([])
 
     wrapper.destroy()
   })

From ce6064cb68003239a393592d2c2fd5868016315c Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 16:44:40 -0300
Subject: [PATCH 2/7] Update form-file.spec.js

---
 src/components/form-file/form-file.spec.js | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/components/form-file/form-file.spec.js b/src/components/form-file/form-file.spec.js
index fd6dffe3e2f..dd0f37f39b1 100644
--- a/src/components/form-file/form-file.spec.js
+++ b/src/components/form-file/form-file.spec.js
@@ -232,25 +232,25 @@ describe('form-file', () => {
 
     // Emulate the files array
     wrapper.vm.setFiles(files)
-    awaitwaitNT(wrapper.vm)
+    await waitNT(wrapper.vm)
     expect(wrapper.emitted('input')).toBeDefined()
     expect(wrapper.emitted('input').length).toEqual(1)
     expect(wrapper.emitted('input')[0][0]).toEqual(files)
 
     // Setting to same array of files should not emit event
     wrapper.vm.setFiles(files)
-    awaitwaitNT(wrapper.vm)
+    await waitNT(wrapper.vm)
     expect(wrapper.emitted('input')).toBeDefined()
     expect(wrapper.emitted('input').length).toEqual(1)
 
     // Setting to new array of same files should not emit event
     wrapper.vm.setFiles([file1, file2])
-    awaitwaitNT(wrapper.vm)
+    await waitNT(wrapper.vm)
     expect(wrapper.emitted('input').length).toEqual(1)
 
     // Setting to array of new files should emit event
     wrapper.vm.setFiles(files.slice().reverse())
-    awaitwaitNT(wrapper.vm)
+    await waitNT(wrapper.vm)
     expect(wrapper.emitted('input').length).toEqual(2)
     expect(wrapper.emitted('input')[1][0]).toEqual(files.slice().reverse())
 
@@ -258,7 +258,7 @@ describe('form-file', () => {
     wrapper.setData({
       selectedFile: null
     })
-    awaitwaitNT(wrapper.vm)
+    await waitNT(wrapper.vm)
     expect(wrapper.emitted('input').length).toEqual(3)
     expect(wrapper.emitted('input')[2][0]).toEqual([])
 

From 8ac054a99a3c0e8b9e9275e755db8eb2487bfec1 Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 16:58:45 -0300
Subject: [PATCH 3/7] Update form-file.spec.js

---
 src/components/form-file/form-file.spec.js | 30 ++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/components/form-file/form-file.spec.js b/src/components/form-file/form-file.spec.js
index dd0f37f39b1..69cccfde108 100644
--- a/src/components/form-file/form-file.spec.js
+++ b/src/components/form-file/form-file.spec.js
@@ -511,6 +511,36 @@ describe('form-file', () => {
     wrapper.destroy()
   })
 
+  it('drag placeholder works', async () => {
+    const wrapper = mount(BFormFile, {
+      propsData: {
+        id: 'foo',
+        placeholder: 'PLACEHOLDER',
+        dropPlaceholder: 'DROPHERE'
+      }
+    })
+
+    expect(wrapper.isVueInstance()).toBe(true)
+    const $label = wrapper.find('label')
+    expect($label.exists()).toBe(true)
+    expect($label.text()).toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+
+    wrapper.trigger('dragover')
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).not.toContain('PLACEHOLDER')
+    expect($label.text()).toContain('DROPHERE')
+
+    wrapper.trigger('dragleave')
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+
+    wrapper.destroy()
+  })
+
   // These tests are wrapped in a new describe to limit the scope of the getBCR Mock
   describe('prop `autofocus`', () => {
     const origGetBCR = Element.prototype.getBoundingClientRect

From ecad0885e1a4d60d077b49564dd2fe96d3fc0bae Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 17:01:12 -0300
Subject: [PATCH 4/7] Update form-file.js

---
 src/components/form-file/form-file.js | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/components/form-file/form-file.js b/src/components/form-file/form-file.js
index 72787d75d80..96e22e4281b 100644
--- a/src/components/form-file/form-file.js
+++ b/src/components/form-file/form-file.js
@@ -225,16 +225,18 @@ export const BFormFile = /*#__PURE__*/ Vue.extend({
       // Triggered when the parent form (if any) is reset
       this.selectedFile = this.multiple ? [] : null
     },
-    onDragover(evt) /* istanbul ignore next: difficult to test in JSDOM */ {
+    onDragover(evt) {
       evt.preventDefault()
       evt.stopPropagation()
       if (this.noDrop || !this.custom) {
         return
       }
       this.dragging = true
-      evt.dataTransfer.dropEffect = 'copy'
+      try {
+        evt.dataTransfer.dropEffect = 'copy'
+      } catch {}
     },
-    onDragleave(evt) /* istanbul ignore next: difficult to test in JSDOM */ {
+    onDragleave(evt) {
       evt.preventDefault()
       evt.stopPropagation()
       this.dragging = false

From 451e5f7d5a6b1f24333bfb1b34327355a629b6d5 Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 17:11:53 -0300
Subject: [PATCH 5/7] Update form-file.spec.js

---
 src/components/form-file/form-file.spec.js | 40 ++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/src/components/form-file/form-file.spec.js b/src/components/form-file/form-file.spec.js
index 69cccfde108..e01360f7b9b 100644
--- a/src/components/form-file/form-file.spec.js
+++ b/src/components/form-file/form-file.spec.js
@@ -511,14 +511,19 @@ describe('form-file', () => {
     wrapper.destroy()
   })
 
-  it('drag placeholder works', async () => {
+  it('drag placeholder and drop works', async () => {
     const wrapper = mount(BFormFile, {
       propsData: {
         id: 'foo',
         placeholder: 'PLACEHOLDER',
-        dropPlaceholder: 'DROPHERE'
+        dropPlaceholder: 'DROPHERE',
+        noDrop: true
       }
     })
+    const file = new File(['foo'], 'foo.txt', {
+      type: 'text/plain',
+      lastModified: Date.now()
+    })
 
     expect(wrapper.isVueInstance()).toBe(true)
     const $label = wrapper.find('label')
@@ -529,6 +534,20 @@ describe('form-file', () => {
     wrapper.trigger('dragover')
     await waitNT(wrapper.vm)
 
+    expect($label.text()).toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+
+    wrapper.setProps({
+      noDrop: false
+    })
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+
+    wrapper.trigger('dragover')
+    await waitNT(wrapper.vm)
+
     expect($label.text()).not.toContain('PLACEHOLDER')
     expect($label.text()).toContain('DROPHERE')
 
@@ -538,6 +557,23 @@ describe('form-file', () => {
     expect($label.text()).toContain('PLACEHOLDER')
     expect($label.text()).not.toContain('DROPHERE')
 
+    wrapper.trigger('dragover')
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).not.toContain('PLACEHOLDER')
+    expect($label.text()).toContain('DROPHERE')
+
+    wrapper.trigger('drop', {
+      dataTransfer: {
+        files: [file]
+      }
+    })
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).not.toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+    expect($label.text()).toContain(file.name)
+
     wrapper.destroy()
   })
 

From 922654f39f8d70cff906b5588b206c7526394099 Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 17:16:22 -0300
Subject: [PATCH 6/7] Update form-file.js

---
 src/components/form-file/form-file.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/form-file/form-file.js b/src/components/form-file/form-file.js
index 96e22e4281b..e9c7b64be11 100644
--- a/src/components/form-file/form-file.js
+++ b/src/components/form-file/form-file.js
@@ -241,7 +241,7 @@ export const BFormFile = /*#__PURE__*/ Vue.extend({
       evt.stopPropagation()
       this.dragging = false
     },
-    onDrop(evt) /* istanbul ignore next: difficult to test in JSDOM */ {
+    onDrop(evt) {
       evt.preventDefault()
       evt.stopPropagation()
       if (this.noDrop) {

From 1c7889e19fc8ce2f0e1c001ed008d17e81bfc5ec Mon Sep 17 00:00:00 2001
From: Troy Morehouse <troymore@nbnet.nb.ca>
Date: Tue, 7 Apr 2020 17:29:10 -0300
Subject: [PATCH 7/7] Update form-file.spec.js

---
 src/components/form-file/form-file.spec.js | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/components/form-file/form-file.spec.js b/src/components/form-file/form-file.spec.js
index e01360f7b9b..5a5233a26fb 100644
--- a/src/components/form-file/form-file.spec.js
+++ b/src/components/form-file/form-file.spec.js
@@ -537,6 +537,17 @@ describe('form-file', () => {
     expect($label.text()).toContain('PLACEHOLDER')
     expect($label.text()).not.toContain('DROPHERE')
 
+    wrapper.trigger('drop', {
+      dataTransfer: {
+        files: [file]
+      }
+    })
+    await waitNT(wrapper.vm)
+
+    expect($label.text()).toContain('PLACEHOLDER')
+    expect($label.text()).not.toContain('DROPHERE')
+    expect($label.text()).not.toContain(file.name)
+
     wrapper.setProps({
       noDrop: false
     })