UNPKG

rollup-plugin-google-cloud-storage

Version:

Uploads build assets to a bucket on Google Cloud Storage

92 lines (76 loc) 2.36 kB
import fs from "node:fs"; import { Storage } from "@google-cloud/storage"; import { afterEach, describe, expect, it, vi } from "vitest"; import { rollup } from "rollup"; import RollupPluginGoogleCloudStorage from "../index"; const mockedBucket = { upload: vi.fn((file) => Promise.resolve(file)), }; const mockedStorage = { bucket: vi.fn(() => mockedBucket), }; vi.mock("ora", () => ({ default: vi.fn(() => ({ start: vi.fn().mockReturnThis(), succeed: vi.fn(), fail: vi.fn(), })), })); vi.mock("@google-cloud/storage", () => ({ Storage: vi.fn(() => mockedStorage), })); async function buildRollupBundle(options) { const bundle = await rollup({ input: "./test/fixtures/main.js", logLevel: "silent", plugins: [RollupPluginGoogleCloudStorage(options)], }); return bundle.write({ dir: "./dist" }); } describe("RollupPluginGoogleCloudStorage", () => { afterEach(() => { fs.rmSync("dist", { recursive: true, force: true }); }); describe("writeBundle", () => { describe("when no options are provided", () => { it("throws a validation error", async () => { await expect(async () => buildRollupBundle()).rejects.toThrowError( /Required/ ); }); }); describe("when directory is not found", () => { it("throws an error", async () => { const options = { bucketName: "my-bucket", directory: "does-not-exist", serviceKeyJson: JSON.stringify({ some: "key" }), }; await expect(async () => buildRollupBundle(options) ).rejects.toThrowError(); }); }); it("uploads files to Google Storage bucket for provided options", async () => { const options = { bucketName: "my-bucket", directory: "./test/fixtures", serviceKeyJson: JSON.stringify({ some: "key" }), }; await buildRollupBundle(options); expect(Storage).toHaveBeenCalledWith({ credentials: JSON.parse(options.serviceKeyJson), }); expect(mockedStorage.bucket).toHaveBeenCalledWith(options.bucketName); expect(mockedBucket.upload).toHaveBeenCalledWith( "./test/fixtures/main.js", { destination: "main.js", preconditionOpts: { ifGenerationMatch: 0, }, } ); }); }); });