diff --git a/client/src/components/Upload/Collection.vue b/client/src/components/Upload/Collection.vue index 64b0947d72f..cb0311f2bca 100644 --- a/client/src/components/Upload/Collection.vue +++ b/client/src/components/Upload/Collection.vue @@ -122,13 +122,11 @@ import _ from "underscore"; import { getGalaxyInstance } from "app"; import UploadRow from "mvc/upload/collection/collection-row"; import UploadBoxMixin from "./UploadBoxMixin"; -import Vue from "vue"; -import BootstrapVue from "bootstrap-vue"; - -Vue.use(BootstrapVue); +import { BButton } from "bootstrap-vue"; export default { mixins: [UploadBoxMixin], + components: { BButton }, data() { return { topInfo: "", @@ -213,6 +211,14 @@ export default { appModel() { return this.app.model; }, + history_id() { + const storeId = this.$store?.getters["betaHistory/currentHistoryId"]; + if (storeId) { + return storeId; + } + const legacyId = this.app.currentHistory(); + return legacyId; + }, }, watch: { extension: function (value) { @@ -274,7 +280,7 @@ export default { }); this.appModel.set({ percentage: 0, status: "success" }); this.counterRunning = this.counterAnnounce; - this.history_id = this.app.currentHistory(); + // package ftp files separately, and remove them from queue this._uploadFtp(); this.uploadbox.start(); diff --git a/client/src/components/Upload/Default.test.js b/client/src/components/Upload/Default.test.js index 16e8c6435f7..f2be411d7fe 100644 --- a/client/src/components/Upload/Default.test.js +++ b/client/src/components/Upload/Default.test.js @@ -1,14 +1,14 @@ import Default from "./Default.vue"; import { mountWithApp } from "./testHelpers"; -import { __RewireAPI__ as rewire } from "./Default"; import Backbone from "backbone"; -describe("Default.vue", () => { - beforeEach(() => { - // Use of select2 in default-row requires this mock. - rewire.__Rewire__("UploadRow", Backbone.View); - }); +jest.mock("app"); +import UploadRow from "mvc/upload/default/default-row"; +jest.mock("mvc/upload/default/default-row"); +UploadRow.mockImplementation(Backbone.View); + +describe("Default.vue", () => { it("loads with correct initial state", async () => { const { wrapper } = mountWithApp(Default); expect(wrapper.vm.counterAnnounce).toBe(0); diff --git a/client/src/components/Upload/Default.vue b/client/src/components/Upload/Default.vue index e3d249d7a61..582873f8de5 100644 --- a/client/src/components/Upload/Default.vue +++ b/client/src/components/Upload/Default.vue @@ -114,13 +114,11 @@ import _ from "underscore"; import { getGalaxyInstance } from "app"; import UploadRow from "mvc/upload/default/default-row"; import UploadBoxMixin from "./UploadBoxMixin"; -import Vue from "vue"; -import BootstrapVue from "bootstrap-vue"; - -Vue.use(BootstrapVue); +import { BButton } from "bootstrap-vue"; export default { mixins: [UploadBoxMixin], + components: { BButton }, props: { multiple: { type: Boolean, @@ -210,6 +208,13 @@ export default { appModel() { return this.app.model; }, + history_id() { + const storeId = this.$store?.getters["betaHistory/currentHistoryId"]; + if (storeId) { + return storeId; + } + return this.app.currentHistoryId; + }, }, watch: { extension: function (value) { @@ -265,7 +270,7 @@ export default { this.appModel.set({ percentage: 0, status: "success" }); this.counterRunning = this.counterAnnounce; - this.history_id = this.app.currentHistory(); + // package ftp files separately, and remove them from queue this._uploadFtp(); diff --git a/client/src/components/Upload/RulesInput.vue b/client/src/components/Upload/RulesInput.vue index bfef378dcaa..42bff9844ab 100644 --- a/client/src/components/Upload/RulesInput.vue +++ b/client/src/components/Upload/RulesInput.vue @@ -74,8 +74,6 @@ import _l from "utils/localization"; import { getGalaxyInstance } from "app"; import UploadBoxMixin from "./UploadBoxMixin"; -import Vue from "vue"; -import BootstrapVue from "bootstrap-vue"; import UploadUtils from "mvc/upload/upload-utils"; import axios from "axios"; import { getAppRoot } from "onload/loadConfig"; @@ -83,13 +81,13 @@ import { filesDialog } from "utils/data"; import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; import { library } from "@fortawesome/fontawesome-svg-core"; import { faEdit } from "@fortawesome/free-solid-svg-icons"; +import { BButton, BLink } from "bootstrap-vue"; + library.add(faEdit); -Vue.use(BootstrapVue); - export default { - components: { FontAwesomeIcon }, mixins: [UploadBoxMixin], + components: { BLink, BButton, FontAwesomeIcon }, data() { return { l: _l, diff --git a/client/src/components/Upload/UploadModal.test.js b/client/src/components/Upload/UploadModal.test.js index 8a7799fd7ea..86288de81f4 100644 --- a/client/src/components/Upload/UploadModal.test.js +++ b/client/src/components/Upload/UploadModal.test.js @@ -1,8 +1,9 @@ import MockAdapter from "axios-mock-adapter"; import axios from "axios"; import UploadModal from "./UploadModal.vue"; - +import store from "../../store"; import { shallowMount, createLocalVue } from "@vue/test-utils"; +import BootstrapVue from "bootstrap-vue"; jest.mock("app"); @@ -13,11 +14,11 @@ const propsData = { describe("UploadModal.vue", () => { let wrapper; - let localVue; let axiosMock; - beforeEach(() => { + beforeEach(async () => { axiosMock = new MockAdapter(axios); + const fastaResponse = { description_url: "https://wiki.galaxyproject.org/Learn/Datatypes#Fasta", display_in_upload: true, @@ -26,7 +27,9 @@ describe("UploadModal.vue", () => { "A sequence in FASTA format consists of a single-line description, followed by lines of sequence data. The first character of the description line is a greater-than ('>') symbol in the first column. All lines should be shorter than 80 characters.", }; const datatypesResponse = [fastaResponse]; + axiosMock.onGet(`/api/datatypes?extension_only=False`).reply(200, datatypesResponse); + const genomesResponse = [ ["Scarlet macaw Jun 2013 (SMACv1.1/araMac1) (araMac1)", "araMac1"], ["Cat Dec. 2008 (NHGRI/GTB V17e/felCat4) (felCat4)", "felCat4"], @@ -34,15 +37,19 @@ describe("UploadModal.vue", () => { ]; axiosMock.onGet(`/api/genomes`).reply(200, genomesResponse); - localVue = createLocalVue(); - wrapper = shallowMount(UploadModal, { - propsData: propsData, - localVue: localVue, + const localVue = createLocalVue(); + localVue.use(BootstrapVue); + + wrapper = await shallowMount(UploadModal, { + store, + propsData, + localVue, }); }); afterEach(() => { axiosMock.restore(); + axiosMock.reset(); }); it("should load with correct defaults", async () => { @@ -51,16 +58,12 @@ describe("UploadModal.vue", () => { }); it("should fetch datatypes and parse them", async () => { - await localVue.nextTick(); - await localVue.nextTick(); expect(wrapper.vm.listExtensions.length).toBe(2); expect(wrapper.vm.listExtensions[0].id).toBe("auto"); expect(wrapper.vm.listExtensions[1].id).toBe("fasta"); }); it("should fetch genomes and parse them", async () => { - await localVue.nextTick(); - await localVue.nextTick(); expect(wrapper.vm.listGenomes.length).toBe(3); }); }); diff --git a/client/src/components/Upload/UploadModal.vue b/client/src/components/Upload/UploadModal.vue index fc8e30dd9be..18bab28dc93 100644 --- a/client/src/components/Upload/UploadModal.vue +++ b/client/src/components/Upload/UploadModal.vue @@ -35,11 +35,8 @@ - - diff --git a/client/src/components/Upload/config.js b/client/src/components/Upload/config.js index 4dbe037e0ae..c0e0cae77c9 100644 --- a/client/src/components/Upload/config.js +++ b/client/src/components/Upload/config.js @@ -4,7 +4,7 @@ import { getAppRoot } from "onload"; export function initializeUploadDefaults(propsData = {}) { const Galaxy = getGalaxyInstance(); const appRoot = getAppRoot(); - return Object.assign(propsData, { + return Object.assign({}, propsData, { uploadPath: Galaxy.config.nginx_upload_path || `${appRoot}api/tools`, chunkUploadSize: Galaxy.config.chunk_upload_size, fileSourcesConfigured: Galaxy.config.file_sources_configured, diff --git a/client/src/components/Upload/mount.js b/client/src/components/Upload/mount.js index b59db4150bc..aa67e14010e 100644 --- a/client/src/components/Upload/mount.js +++ b/client/src/components/Upload/mount.js @@ -1,6 +1,7 @@ import Vue from "vue"; import UploadModal from "./UploadModal"; import { initializeUploadDefaults } from "./config"; +import store from "../../store"; export function mount(propsData = {}) { propsData = initializeUploadDefaults(propsData); @@ -9,5 +10,6 @@ export function mount(propsData = {}) { document.getElementsByTagName("body")[0].appendChild(vm); new instance({ propsData: propsData, + store, }).$mount(vm); } diff --git a/client/src/components/Upload/testHelpers.js b/client/src/components/Upload/testHelpers.js index 737047fcf31..965ee7fb3da 100644 --- a/client/src/components/Upload/testHelpers.js +++ b/client/src/components/Upload/testHelpers.js @@ -2,10 +2,10 @@ import _ from "underscore"; import Backbone from "backbone"; import "utils/uploadbox"; import { mount, createLocalVue } from "@vue/test-utils"; -import { getNewAttachNode } from "jest/helpers"; +import BootstrapVue from "bootstrap-vue"; -export function mountWithApp(component, options = {}, propsData_ = {}) { - const app = _.defaults(options, { +export const createMockApp = (options = {}) => { + return _.defaults(options, { defaultExtension: "auto", currentFtp: () => { return "ftp://localhost"; @@ -32,15 +32,22 @@ export function mountWithApp(component, options = {}, propsData_ = {}) { }, ], }); +}; + +export function mountWithApp(component, options = {}, propsData_ = {}) { + const app = createMockApp(options); const propsData = _.defaults(propsData_, { app }); + const localVue = createLocalVue(); + localVue.use(BootstrapVue); + const wrapper = mount(component, { propsData, localVue, - attachTo: getNewAttachNode(), stubs: { select2: true, }, }); + return { wrapper, localVue }; }