Skip to content

Commit

Permalink
Merge pull request #342 from forta-network/support-publishing-externa…
Browse files Browse the repository at this point in the history
…l-bots

add support for publishing external bots
  • Loading branch information
haseebrabbani committed Sep 28, 2023
2 parents 6f2edb0 + 1105623 commit f9d2d48
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 151 deletions.
117 changes: 80 additions & 37 deletions cli/commands/publish/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,84 @@
import { Wallet } from "ethers"
import providePublish from "."
import { CommandHandler } from "../.."
import { Wallet } from "ethers";
import providePublish from ".";
import { CommandHandler } from "../..";

describe("publish", () => {
let publish: CommandHandler
const mockGetCredentials = jest.fn()
const mockUploadImage = jest.fn()
const mockUploadManifest = jest.fn()
const mockPushToRegistry = jest.fn()
let publish: CommandHandler;
const mockGetCredentials = jest.fn();
const mockUploadImage = jest.fn();
const mockUploadManifest = jest.fn();
const mockPushToRegistry = jest.fn();
const mockPrivateKey = "0x4567";
const mockImageRef = "abc123";
const mockManifestRef = "def456";
let mockExternal = false;

beforeEach(() => {
mockUploadImage.mockReset();
mockGetCredentials.mockReset();
mockUploadManifest.mockReset();
mockPushToRegistry.mockReset();

mockGetCredentials.mockReturnValueOnce({ privateKey: mockPrivateKey });
mockUploadImage.mockReturnValueOnce(mockImageRef);
mockUploadManifest.mockReturnValueOnce(mockManifestRef);
});

beforeAll(() => {
publish = providePublish(mockGetCredentials, mockUploadImage, mockUploadManifest, mockPushToRegistry)
})

it("publishes the agent correctly", async () => {
const mockPrivateKey = "0x4567"
mockGetCredentials.mockReturnValueOnce({ privateKey: mockPrivateKey})
const mockImageRef = "abc123"
mockUploadImage.mockReturnValueOnce(mockImageRef)
const mockManifestRef = "def456"
mockUploadManifest.mockReturnValueOnce(mockManifestRef)

await publish()

expect(mockUploadImage).toHaveBeenCalledTimes(1)
expect(mockUploadImage).toHaveBeenCalledWith()
expect(mockUploadImage).toHaveBeenCalledBefore(mockGetCredentials)
expect(mockGetCredentials).toHaveBeenCalledTimes(1)
expect(mockGetCredentials).toHaveBeenCalledWith()
expect(mockGetCredentials).toHaveBeenCalledBefore(mockUploadManifest)
expect(mockUploadManifest).toHaveBeenCalledTimes(1)
expect(mockUploadManifest).toHaveBeenCalledWith(mockImageRef, mockPrivateKey)
expect(mockUploadManifest).toHaveBeenCalledBefore(mockPushToRegistry)
expect(mockPushToRegistry).toHaveBeenCalledTimes(1)
const [manifestRef, fromWallet] = mockPushToRegistry.mock.calls[0]
expect(manifestRef).toEqual(mockManifestRef)
expect(fromWallet).toBeInstanceOf(Wallet)
expect(fromWallet.address).toEqual(new Wallet(mockPrivateKey).address)
})
})
publish = providePublish(
mockGetCredentials,
mockUploadImage,
mockUploadManifest,
mockPushToRegistry,
mockExternal
);
});

it("publishes the image and manifest correctly", async () => {
await publish();

expect(mockUploadImage).toHaveBeenCalledTimes(1);
expect(mockUploadImage).toHaveBeenCalledWith();
expect(mockUploadImage).toHaveBeenCalledBefore(mockGetCredentials);
expect(mockGetCredentials).toHaveBeenCalledTimes(1);
expect(mockGetCredentials).toHaveBeenCalledWith();
expect(mockGetCredentials).toHaveBeenCalledBefore(mockUploadManifest);
expect(mockUploadManifest).toHaveBeenCalledTimes(1);
expect(mockUploadManifest).toHaveBeenCalledWith(
mockImageRef,
mockPrivateKey
);
expect(mockUploadManifest).toHaveBeenCalledBefore(mockPushToRegistry);
expect(mockPushToRegistry).toHaveBeenCalledTimes(1);
const [manifestRef, fromWallet] = mockPushToRegistry.mock.calls[0];
expect(manifestRef).toEqual(mockManifestRef);
expect(fromWallet).toBeInstanceOf(Wallet);
expect(fromWallet.address).toEqual(new Wallet(mockPrivateKey).address);
});

it("does not publish an image for external bots", async () => {
mockExternal = true;
publish = providePublish(
mockGetCredentials,
mockUploadImage,
mockUploadManifest,
mockPushToRegistry,
mockExternal
);

await publish();

expect(mockUploadImage).toHaveBeenCalledTimes(0);
expect(mockGetCredentials).toHaveBeenCalledTimes(1);
expect(mockGetCredentials).toHaveBeenCalledWith();
expect(mockGetCredentials).toHaveBeenCalledBefore(mockUploadManifest);
expect(mockUploadManifest).toHaveBeenCalledTimes(1);
expect(mockUploadManifest).toHaveBeenCalledWith(undefined, mockPrivateKey);
expect(mockUploadManifest).toHaveBeenCalledBefore(mockPushToRegistry);
expect(mockPushToRegistry).toHaveBeenCalledTimes(1);
const [manifestRef, fromWallet] = mockPushToRegistry.mock.calls[0];
expect(manifestRef).toEqual(mockManifestRef);
expect(fromWallet).toBeInstanceOf(Wallet);
expect(fromWallet.address).toEqual(new Wallet(mockPrivateKey).address);
});
});
41 changes: 23 additions & 18 deletions cli/commands/publish/index.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
import { CommandHandler } from '../..'
import { assertExists } from '../../utils'
import { GetCredentials } from '../../utils/get.credentials'
import { UploadImage } from './upload.image'
import { UploadManifest } from './upload.manifest'
import { PushToRegistry } from './push.to.registry'
import { Wallet } from 'ethers'
import { CommandHandler } from "../..";
import { assertExists } from "../../utils";
import { GetCredentials } from "../../utils/get.credentials";
import { UploadImage } from "./upload.image";
import { UploadManifest } from "./upload.manifest";
import { PushToRegistry } from "./push.to.registry";
import { Wallet } from "ethers";

export default function providePublish(
getCredentials: GetCredentials,
uploadImage: UploadImage,
uploadManifest: UploadManifest,
pushToRegistry: PushToRegistry
pushToRegistry: PushToRegistry,
external: boolean
): CommandHandler {
assertExists(getCredentials, 'getCredentials')
assertExists(uploadImage, 'uploadImage')
assertExists(uploadManifest, 'uploadManifest')
assertExists(pushToRegistry, 'pushToRegistry')
assertExists(getCredentials, "getCredentials");
assertExists(uploadImage, "uploadImage");
assertExists(uploadManifest, "uploadManifest");
assertExists(pushToRegistry, "pushToRegistry");

return async function publish() {
const imageReference = await uploadImage()
const { privateKey } = await getCredentials()
const manifestReference = await uploadManifest(imageReference, privateKey)
await pushToRegistry(manifestReference, new Wallet(privateKey))
}
}
let imageReference;
// external bots do not have docker images so no need to upload one
if (!external) {
imageReference = await uploadImage();
}
const { privateKey } = await getCredentials();
const manifestReference = await uploadManifest(imageReference, privateKey);
await pushToRegistry(manifestReference, new Wallet(privateKey));
};
}
Loading

0 comments on commit f9d2d48

Please sign in to comment.