import { createTestingPinia } from "@pinia/testing";
import { shallowMount } from "@vue/test-utils";
import flushPromises from "flush-promises";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { defineComponent } from "vue";
import { useServerMock } from "@/api/client/__mocks__";
import type { BrowsableFilesSourcePlugin } from "@/api/remoteFiles";
import { useFileSources } from "./fileSources";
const REMOTE_FILES_API_ROUTE = "/api/remote_files/plugins";
const TestComponent = defineComponent({
setup() {
return {
// Call the composable and expose all return values into our
// component instance so we can access them with wrapper.vm
...useFileSources(),
};
},
template: `
{{ isLoading }}
{{ hasWritable }}
{{ fileSources }}
`,
});
function setupWrapper(): any {
const pinia = createTestingPinia({ createSpy: vi.fn, stubActions: false });
return shallowMount(TestComponent, { pinia });
}
function buildFakeFileSource(id: string, writable: boolean = true): BrowsableFilesSourcePlugin {
const type = `${id}Type`;
return {
id: id,
type,
uri_root: `${type}://`,
label: `${id} Label`,
doc: `${id} Doc`,
writable,
browsable: true,
supports: {
pagination: false,
search: false,
sorting: false,
},
};
}
const { server, http } = useServerMock();
describe("useFileSources", () => {
beforeEach(async () => {
server.use(
http.get(REMOTE_FILES_API_ROUTE, ({ response }) => {
return response(200).json([]);
}),
);
});
it("should be initially loading", async () => {
const wrapper = setupWrapper();
expect(wrapper.vm.isLoading).toBe(true);
});
it("should fetch file sources on mount", async () => {
const expectedFileSources = [buildFakeFileSource("foo")];
server.use(
http.get(REMOTE_FILES_API_ROUTE, ({ response }) => {
return response(200).json(expectedFileSources);
}),
);
const wrapper = setupWrapper();
expect(wrapper.vm.isLoading).toBe(true);
await flushPromises();
expect(wrapper.vm.isLoading).toBe(false);
expect(wrapper.vm.fileSources).toEqual(expectedFileSources);
});
it("should set hasWritable to false if no file sources are writable", async () => {
const expectedFileSources = [buildFakeFileSource("foo", false), buildFakeFileSource("bar", false)];
server.use(
http.get(REMOTE_FILES_API_ROUTE, ({ response }) => {
return response(200).json(expectedFileSources);
}),
);
const wrapper = setupWrapper();
await flushPromises();
expect(wrapper.vm.hasWritable).toEqual(false);
});
it("should set hasWritable to true if any file sources are writable", async () => {
const expectedFileSources = [buildFakeFileSource("foo", true), buildFakeFileSource("bar", false)];
server.use(
http.get(REMOTE_FILES_API_ROUTE, ({ response }) => {
return response(200).json(expectedFileSources);
}),
);
const wrapper = setupWrapper();
await flushPromises();
expect(wrapper.vm.hasWritable).toEqual(true);
});
});