poto-siril
Version:
Automatization around Siril (<https://siril.org/>) for deep sky astrophotography.
601 lines (600 loc) • 29.2 kB
JavaScript
import { jest } from "@jest/globals"; // Import Jest globals
import path from "path";
import fs from "fs-extra";
import Enquirer from "enquirer";
import prepare from "../../commands/prepare.js";
import { POTO_JSON } from "../../utils/const.js";
import clear from "../../commands/clear.js";
import { generateScripts } from "../../commands/preprocess.generate-scripts.js";
import { getRealDataFromSample, spawnMockedDatasetToFs_dataset_1, } from "../fixtures.js";
import { logger } from "../../utils/logger.js";
describe("E2E", () => {
let asiAirDirectory = "";
let bankDirectory = "";
let projectDirectory = "";
let logMessages = [];
const promptMock = jest.fn();
beforeEach(() => {
jest.useFakeTimers().setSystemTime(new Date(Date.UTC(2024, 9, 15)));
({ asiAirDirectory, bankDirectory, projectDirectory } =
spawnMockedDatasetToFs_dataset_1());
// Spy on logger and Enquirer to capture logs and prompts.
logMessages = [];
const logMethods = [
"info",
"warning",
"debug",
"error",
"success",
"step",
"space",
];
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/no-unused-vars
const originalMethods = logMethods.reduce((acc, method) => {
acc[method] = logger[method];
return acc;
},
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
{});
logMethods.forEach(method => {
jest
.spyOn(logger, method)
.mockImplementation((...args) => {
const message = `${method}: ${args.join(" ")}`;
logMessages.push(message);
//originalMethods[method].apply(logger, args);
});
});
jest
.spyOn(Enquirer.prototype, "prompt")
.mockImplementation(async function (...args) {
logMessages.push(`prompt: ${JSON.stringify(args, null, 2)}`);
return promptMock(...args);
});
});
afterEach(() => {
jest.restoreAllMocks();
fs.removeSync(projectDirectory);
});
afterAll(() => {
// To ease debugging.
fs.removeSync(projectDirectory);
spawnMockedDatasetToFs_dataset_1();
});
it("should be neat", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use Autorun directory",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
let files = fs.readdirSync(asiAirDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files.filter(f => f.endsWith("_thn.jpg"))).toHaveLength(3);
clear(asiAirDirectory);
files = fs.readdirSync(asiAirDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files.filter(f => f.endsWith("_thn.jpg"))).toHaveLength(0);
// Make an empty directory to test `removeEmptyDirectories`.
fs.mkdirSync(path.join(asiAirDirectory, "empty", "empty"), {
recursive: true,
});
expect(fs.existsSync(path.join(asiAirDirectory, "empty", "empty"))).toBe(true);
clear(asiAirDirectory);
expect(fs.existsSync(path.join(asiAirDirectory, "empty", "empty"))).toBe(false);
expect(fs.existsSync(path.join(asiAirDirectory, "empty"))).toBe(false);
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
});
files = fs.readdirSync(projectDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files).toMatchInlineSnapshot(`
[
"Flat_1.0ms_Bin1_gain0",
"H",
"Light_60.0s_Bin1_gain0",
"S",
"_poto_siril.json",
"any",
"Flat_1.0ms_Bin1_gain0/Flat_1.0ms_Bin1_gain0_20240512-094309_-10.5C_0001.fit",
"H/Flat_1.0ms_Bin1_H_gain100",
"H/Light_60.0s_Bin1_H_gain0",
"Light_60.0s_Bin1_gain0/Light_FOV_60.0s_Bin1_gain0_20240629-010840_-10.1C_0001.fit",
"Light_60.0s_Bin1_gain0/Light_FOV_60.0s_Bin1_gain0_20240629-010841_-10.1C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820",
"any/Bias_1.0ms_Bin1_gain0",
"any/Bias_1.0ms_Bin1_gain100",
"any/Dark_120.0s_Bin1_gain0",
"any/Dark_60.0s_Bin1_gain0",
"any/Dark_60.0s_Bin1_gain100",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094306_-10.5C_0001.fit",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094307_-10.5C_0002.fit",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094308_-10.5C_0003.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010850_-10.1C_0002.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010851_-10.1C_0004.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010852_-10.1C_0005.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094304_-10.5C_0001.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094305_-10.0C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094306_-10.5C_0003.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094304_-10.5C_0001.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094305_-10.0C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094306_-10.5C_0003.fit",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853/Light_FOV_120.0s_Bin1_S_gain0_20240626-010853_-10.1C_0001.fit",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853/Light_FOV_120.0s_Bin1_S_gain0_20240626-010854_-10.1C_0002.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010840_-10.1C_0001.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010841_-10.1C_0002.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010842_-10.1C_0003.fit",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820/Light_FOV_60.0s_Bin1_S_gain100_20240627-010820_-10.1C_0001.fit",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820/Light_FOV_60.0s_Bin1_S_gain100_20240627-010821_-10.1C_0002.fit",
"any/Bias_1.0ms_Bin1_gain0/Bias_1.0ms_Bin1_gain0_20230910-101141_-9.8C_0001.fit",
"any/Bias_1.0ms_Bin1_gain100/Bias_1.0ms_Bin1_gain100_20230910-101131_-9.8C_0001.fit",
"any/Bias_1.0ms_Bin1_gain100/Bias_1.0ms_Bin1_gain100_20230910-101132_-9.8C_0002.fit",
"any/Bias_1.0ms_Bin1_gain100/Bias_1.0ms_Bin1_gain100_20230910-101133_-9.8C_0003.fit",
"any/Dark_120.0s_Bin1_gain0/Dark_120.0s_Bin1_L_gain0_20240308-155723_-10.0C_0001.fit",
"any/Dark_120.0s_Bin1_gain0/Dark_120.0s_Bin1_L_gain0_20240308-155724_-10.0C_0002.fit",
"any/Dark_60.0s_Bin1_gain0/Dark_60.0s_Bin1_gain0_20240308-155722_-10.0C_0001.fit",
"any/Dark_60.0s_Bin1_gain0/Dark_60.0s_Bin1_gain0_20240308-155723_-10.0C_0002.fit",
"any/Dark_60.0s_Bin1_gain100/Dark_60.0s_Bin1_L_gain100_20240308-155722_-10.0C_0001.fit",
"any/Dark_60.0s_Bin1_gain100/Dark_60.0s_Bin1_L_gain100_20240308-155723_-10.0C_0002.fit",
"any/Dark_60.0s_Bin1_gain100/Dark_60.0s_Bin1_L_gain100_20240308-155724_-10.0C_0003.fit",
"any/Dark_60.0s_Bin1_gain100/Dark_60.0s_Bin1_L_gain100_20240308-155725_-10.0C_0004.fit",
]
`);
const potoJson = fs.readFileSync(path.join(projectDirectory, POTO_JSON), {
encoding: "utf8",
});
expect(potoJson).toMatchSnapshot();
await generateScripts(projectDirectory, "src/pipeline/Mono_Preprocessing/Mono_Preprocessing.ssf");
files = fs.readdirSync(projectDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
const scripts = files.filter(f => f.endsWith(".ssf"));
expect(scripts).toHaveLength(5);
expect(scripts).toMatchInlineSnapshot(`
[
"Light_60.0s_Bin1_gain0_process/_poto_Mono_Preprocessing.ssf",
"H/Light_60.0s_Bin1_H_gain0_process/_poto_Mono_Preprocessing.ssf",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853_process/_poto_Mono_Preprocessing.ssf",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840_process/_poto_Mono_Preprocessing.ssf",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820_process/_poto_Mono_Preprocessing.ssf",
]
`);
for (const script of scripts) {
const scriptContent = fs.readFileSync(path.join(projectDirectory, script), {
encoding: "utf8",
});
expect(scriptContent).toMatchSnapshotWithNormalizedPaths();
}
expect(logMessages).toMatchSnapshotWithNormalizedPaths();
});
describe("reading an input directory, asking plan/autorun question", () => {
it("should errorthrow if no files", async () => {
const autorunDirectory = `${asiAirDirectory}/Autorun`;
fs.removeSync(autorunDirectory);
const planDirectory = `${asiAirDirectory}/Plan`;
fs.removeSync(planDirectory);
promptMock.mockResolvedValueOnce({
createProjectDirectory: true,
});
await expect(prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
})).rejects.toThrow(`No FITS files found in input dir ${asiAirDirectory}`);
});
it("should errorthrow if no files (ASIAIR version)", async () => {
const autorunDirectory = `${asiAirDirectory}/Autorun`;
fs.removeSync(autorunDirectory);
const planDirectory = `${asiAirDirectory}/Plan`;
fs.removeSync(planDirectory);
fs.mkdirSync(planDirectory);
promptMock.mockResolvedValueOnce({
createProjectDirectory: true,
});
await expect(prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
})).rejects.toThrow("No FITS files found in Autorun nor Plan folders.");
});
it("should errorthrow if directory does not exists", async () => {
fs.removeSync(asiAirDirectory);
promptMock.mockResolvedValueOnce({
createProjectDirectory: true,
});
await expect(prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
})).rejects.toThrow(`Input directory ${asiAirDirectory} does not exists.`);
});
it("should auto pick Autorun files", async () => {
const planDirectory = `${asiAirDirectory}/Plan`;
fs.removeSync(planDirectory);
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
});
const files = fs.readdirSync(projectDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files).toContain("H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010850_-10.1C_0002.fit");
});
it("should auto pick Plan files", async () => {
const autorunDirectory = `${asiAirDirectory}/Autorun`;
fs.removeSync(autorunDirectory);
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
});
expect(logMessages).toContain("info: 🔭 Cumulated light integration: 0 minutes.");
const files = fs.readdirSync(projectDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files.length).toBe(1);
});
it("should pick both directories", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use both directory",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
});
expect(logMessages).toContain(`info: Found 27 FITS in input dir ${asiAirDirectory}.`);
});
it("should pick plan directorie", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use Plan directory",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory, bankDirectory],
});
expect(logMessages).toContain(`info: Found 1 FITS in input dir ${asiAirDirectory}.`);
});
});
describe("no Darks/Biases matching, multiples sequences", () => {
it("should warn if no matching darks and biases", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use Autorun directory",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory], // No bank directory in input.
});
const files = fs.readdirSync(projectDirectory, {
recursive: true,
withFileTypes: false,
encoding: "utf8",
});
expect(files).toMatchInlineSnapshot(`
[
"Flat_1.0ms_Bin1_gain0",
"H",
"Light_60.0s_Bin1_gain0",
"S",
"_poto_siril.json",
"Flat_1.0ms_Bin1_gain0/Flat_1.0ms_Bin1_gain0_20240512-094309_-10.5C_0001.fit",
"H/Flat_1.0ms_Bin1_H_gain100",
"H/Light_60.0s_Bin1_H_gain0",
"Light_60.0s_Bin1_gain0/Light_FOV_60.0s_Bin1_gain0_20240629-010840_-10.1C_0001.fit",
"Light_60.0s_Bin1_gain0/Light_FOV_60.0s_Bin1_gain0_20240629-010841_-10.1C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094306_-10.5C_0001.fit",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094307_-10.5C_0002.fit",
"H/Flat_1.0ms_Bin1_H_gain100/Flat_1.0ms_Bin1_H_gain100_20240511-094308_-10.5C_0003.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010850_-10.1C_0002.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010851_-10.1C_0004.fit",
"H/Light_60.0s_Bin1_H_gain0/Light_FOV_60.0s_Bin1_H_gain0_20240625-010852_-10.1C_0005.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094304_-10.5C_0001.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094305_-10.0C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240624-094306_-10.5C_0003.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094304_-10.5C_0001.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094305_-10.0C_0002.fit",
"S/Flat_1.0ms_Bin1_S_gain100/Flat_1.0ms_Bin1_S_gain100_20240626-094306_-10.5C_0003.fit",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853/Light_FOV_120.0s_Bin1_S_gain0_20240626-010853_-10.1C_0001.fit",
"S/Light_120.0s_Bin1_S_gain0__20240626-010853/Light_FOV_120.0s_Bin1_S_gain0_20240626-010854_-10.1C_0002.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010840_-10.1C_0001.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010841_-10.1C_0002.fit",
"S/Light_60.0s_Bin1_S_gain100__20240624-010840/Light_FOV_60.0s_Bin1_S_gain100_20240624-010842_-10.1C_0003.fit",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820/Light_FOV_60.0s_Bin1_S_gain100_20240627-010820_-10.1C_0001.fit",
"S/Light_60.0s_Bin1_S_gain100__20240627-010820/Light_FOV_60.0s_Bin1_S_gain100_20240627-010821_-10.1C_0002.fit",
]
`);
const potoJson = fs.readFileSync(path.join(projectDirectory, POTO_JSON), {
encoding: "utf8",
});
expect(potoJson).toMatchSnapshot();
expect(logMessages).toMatchSnapshotWithNormalizedPaths();
expect(logMessages).toContain("error: No darks matching light set Light_60.0s_Bin1_H_gain0 (regardless of temperature filtering).");
});
it("should warn if no matching darks (temperature filtering)", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use Autorun directory",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
fs.writeFileSync(path.join(asiAirDirectory, "Autorun/Dark_60.0s_Bin1_S_gain100_20240308-155722_-66.0C_0001.fit"), getRealDataFromSample("Dark"));
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory], // No bank directory in input.
});
expect(logMessages).toContain("error: No darks matching light set Light_60.0s_Bin1_H_gain0 (regardless of temperature filtering).");
expect(logMessages).toContain("error: No darks available for Light_60.0s_Bin1_S_gain100 with temperature window +-3.");
expect(logMessages).toContain("info: There are 1 darks for Light_60.0s_Bin1_S_gain100 if we ignore temperature.");
});
it("should warn if multiples darks and biases sequences", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
selectedInputSubDirectory: "Use Autorun directory",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240624-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
selectedFlatSequence: "Flat_1.0ms_Bin1_S_gain100__20240626-094304",
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
fs.writeFileSync(path.join(asiAirDirectory, "Autorun/Dark_60.0s_Bin1_S_gain100_20250101-155722_-10.0C_0001.fit"), getRealDataFromSample("Dark"));
fs.writeFileSync(path.join(asiAirDirectory, "Autorun/Dark_60.0s_Bin1_S_gain100_20250102-155722_-10.0C_0001.fit"), // another sequence
getRealDataFromSample("Dark"));
fs.writeFileSync(path.join(asiAirDirectory, "Autorun/Bias_1.0ms_Bin1_gain100_20250101-101131_-9.8C_0001.fit"), getRealDataFromSample("Bias"));
fs.writeFileSync(path.join(asiAirDirectory, "Autorun/Bias_1.0ms_Bin1_gain100_20250102-101131_-9.8C_0001.fit"), // another sequence
getRealDataFromSample("Bias"));
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory], // No bank directory in input.
});
expect(logMessages).toContain("warning: Multiple dark sequences found for Light_60.0s_Bin1_S_gain100: 20250101-155722, 20250102-155722");
expect(logMessages).toContain("warning: Gathering them all for the master dark. Make sure that's what you wanted.");
expect(logMessages).toContain("warning: Multiple bias sequences found for Flat_1.0ms_Bin1_S_gain100: 20250101-101131, 20250102-101131");
expect(logMessages).toContain("warning: Gathering them all for the master bias. Make sure that's what you wanted.");
});
});
describe("checking if project path is already populated/dir not exists etc...", () => {
const logInEnquirerAskingToCreateDirectory = "Directory tmp/project does not exist. Do you want to create it?";
const logInEnquirerAskOverwrite = "Directory tmp/project already have a _poto_siril.json. Continue?";
const logAbort = "warning: Aborted.";
const logAfterTheCheckDirectory = "step: Reading input directories";
beforeEach(() => {
const planDirectory = `${asiAirDirectory}/Plan`;
fs.removeSync(planDirectory);
const FlatDirectory = `${asiAirDirectory}/Autorun/Flat`;
fs.removeSync(FlatDirectory);
});
it("should ask to create project directory because the dir does not exist", async () => {
promptMock
.mockResolvedValueOnce({
createProjectDirectory: true,
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory],
});
expect(logMessages.filter(x => x.includes(logInEnquirerAskingToCreateDirectory))).toHaveLength(1);
expect(logMessages.filter(x => x.includes(logInEnquirerAskOverwrite))).toHaveLength(0);
expect(logMessages).not.toContain(logAbort);
expect(logMessages).toContain(logAfterTheCheckDirectory);
});
it("should ask to create project directory because the dir does not exist (abort)", async () => {
promptMock.mockResolvedValueOnce({
createProjectDirectory: false,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory],
});
expect(logMessages.filter(x => x.includes(logInEnquirerAskingToCreateDirectory))).toHaveLength(1);
expect(logMessages.filter(x => x.includes(logInEnquirerAskOverwrite))).toHaveLength(0);
expect(logMessages).toContain(logAbort);
expect(logMessages).not.toContain(logAfterTheCheckDirectory);
});
it("should not ask to create project directory because the dir exists (empty)", async () => {
fs.mkdirSync(projectDirectory, { recursive: true });
promptMock
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory],
});
expect(logMessages.filter(x => x.includes(logInEnquirerAskingToCreateDirectory))).toHaveLength(0);
expect(logMessages.filter(x => x.includes(logInEnquirerAskOverwrite))).toHaveLength(0);
expect(logMessages).not.toContain(logAbort);
expect(logMessages).toContain(logAfterTheCheckDirectory);
});
it("should abort if we decide not to (project dir already exists)", async () => {
fs.mkdirSync(projectDirectory, { recursive: true });
fs.writeFileSync(path.join(projectDirectory, POTO_JSON), "{}");
promptMock.mockResolvedValueOnce({
continueEvenIfProjectAlreadyExists: false,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory],
});
expect(logMessages.filter(x => x.includes(logInEnquirerAskingToCreateDirectory))).toHaveLength(0);
expect(logMessages.filter(x => x.includes(logInEnquirerAskOverwrite))).toHaveLength(1);
expect(logMessages).toContain(logAbort);
expect(logMessages).not.toContain(logAfterTheCheckDirectory);
});
it("should continue if we decide to (project dir already exists)", async () => {
fs.mkdirSync(projectDirectory, { recursive: true });
fs.writeFileSync(path.join(projectDirectory, POTO_JSON), "{}");
promptMock
.mockResolvedValueOnce({
continueEvenIfProjectAlreadyExists: true,
})
.mockResolvedValueOnce({
darkTemperatureTolerance: 3,
})
.mockResolvedValueOnce({
go: true,
});
await prepare({
projectDirectory,
inputDirectories: [asiAirDirectory],
});
expect(logMessages.filter(x => x.includes(logInEnquirerAskingToCreateDirectory))).toHaveLength(0);
expect(logMessages.filter(x => x.includes(logInEnquirerAskOverwrite))).toHaveLength(1);
expect(logMessages).not.toContain(logAbort);
expect(logMessages).toContain(logAfterTheCheckDirectory);
});
});
describe("clear function tests", () => {
it("should throw not asiair directory", async () => {
expect(() => clear(bankDirectory)).toThrow("Not an ASIAIR directory!");
});
});
});