Skip to content

Commit 809c1b3

Browse files
committed
clean-slate when dry-run is enabled + tests
1 parent 5c7a469 commit 809c1b3

File tree

2 files changed

+92
-5
lines changed

2 files changed

+92
-5
lines changed

Diff for: src/deploy.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,19 @@ async function connect(client: ftp.Client, args: IFtpDeployArgumentsWithDefaults
6666
}
6767
}
6868

69-
async function getServerFiles(client: ftp.Client, logger: ILogger, timings: ITimings, args: IFtpDeployArgumentsWithDefaults): Promise<IFileList> {
69+
export async function getServerFiles(client: ftp.Client, logger: ILogger, timings: ITimings, args: IFtpDeployArgumentsWithDefaults): Promise<IFileList> {
7070
try {
7171
await ensureDir(client, logger, timings, args["server-dir"]);
7272

7373
if (args["dangerous-clean-slate"]) {
7474
logger.all(`----------------------------------------------------------------`);
7575
logger.all("🗑️ Removing all files on the server because 'dangerous-clean-slate' was set, this will make the deployment very slow...");
76-
await client.clearWorkingDir();
76+
if (args["dry-run"] === false) {
77+
await client.clearWorkingDir();
78+
}
7779
logger.all("Clear complete");
7880

79-
throw new Error("nope");
81+
throw new Error("dangerous-clean-slate was run");
8082
}
8183

8284
const serverFiles = await downloadFileList(client, logger, args["state-name"]);

Diff for: src/main.test.ts

+87-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { HashDiff } from "./HashDiff";
2-
import { IFileList, currentSyncFileVersion, IFile, IFtpDeployArgumentsWithDefaults } from "./types";
2+
import { IFileList, currentSyncFileVersion, IFile, IFtpDeployArgumentsWithDefaults, DiffResult } from "./types";
33
import { Record } from "./types";
44
import { applyExcludeFilter, getDefaultSettings, ILogger, Timings } from "./utilities";
55
import path from "path";
66
import FtpSrv from "ftp-srv";
77
import { getLocalFiles } from "./localFiles";
88
import { FTPSyncProvider } from "./syncProvider";
9-
import { deploy } from "./deploy";
9+
import { deploy, getServerFiles } from "./deploy";
1010
import { Stats as readdirStats } from "@jsdevtools/readdir-enhanced";
1111
import { excludeDefaults } from "./module";
1212

@@ -787,6 +787,91 @@ describe("error handling", () => {
787787
}, 30000);
788788
});
789789

790+
describe("dry-run", () => {
791+
test("getServerFiles doesn't mutate server", async () => {
792+
const mockedLogger = new MockedLogger();
793+
const mockedTimings = new Timings();
794+
const mockClient = {
795+
clearWorkingDir() { },
796+
ensureDir() { },
797+
};
798+
const settings = getDefaultSettings({
799+
server: "a",
800+
username: "b",
801+
password: "c",
802+
"dry-run": true,
803+
"dangerous-clean-slate": true,
804+
});
805+
806+
const spyClearWorkingDir = jest.spyOn(mockClient, "clearWorkingDir");
807+
await getServerFiles(mockClient as any, mockedLogger, mockedTimings, settings);
808+
809+
expect(spyClearWorkingDir).toHaveBeenCalledTimes(0);
810+
});
811+
812+
test("doesn't mutate server", async () => {
813+
const mockedLogger = new MockedLogger();
814+
const mockedTimings = new Timings();
815+
const mockClient = {
816+
uploadFile() { },
817+
removeFile() { },
818+
uploadFrom() { },
819+
remove() { },
820+
};
821+
const mockedDiffs: DiffResult = {
822+
upload: [
823+
{
824+
type: "file",
825+
name: "path/upload.txt",
826+
size: 1000,
827+
hash: "hash2",
828+
}
829+
],
830+
delete: [
831+
{
832+
type: "file",
833+
name: "path/delete.txt",
834+
size: 1000,
835+
hash: "hash2",
836+
}
837+
],
838+
replace: [
839+
{
840+
type: "file",
841+
name: "path/replace.txt",
842+
size: 1000,
843+
hash: "hash2",
844+
}
845+
],
846+
same: [
847+
{
848+
type: "file",
849+
name: "path/same.txt",
850+
size: 1000,
851+
hash: "hash2",
852+
}
853+
],
854+
sizeUpload: 1000,
855+
sizeDelete: 1000,
856+
sizeReplace: 1000,
857+
};
858+
859+
// todo ensureDir
860+
861+
const syncProvider = new FTPSyncProvider(mockClient as any, mockedLogger, mockedTimings, "local-dir/", "server-dir/", "state-name", true);
862+
const spyUploadFile = jest.spyOn(mockClient, "uploadFile");
863+
const spyRemoveFile = jest.spyOn(mockClient, "removeFile");
864+
const spyUploadFrom = jest.spyOn(mockClient, "uploadFrom");
865+
const spyRemove = jest.spyOn(mockClient, "remove");
866+
await syncProvider.syncLocalToServer(mockedDiffs);
867+
868+
expect(spyUploadFile).toHaveBeenCalledTimes(0);
869+
expect(spyRemoveFile).toHaveBeenCalledTimes(0);
870+
expect(spyUploadFrom).toHaveBeenCalledTimes(0);
871+
expect(spyRemove).toHaveBeenCalledTimes(0);
872+
});
873+
});
874+
790875
describe("Deploy", () => {
791876
const port = 2121;
792877
const homeDir = path.join(__dirname, "../");

0 commit comments

Comments
 (0)