aoc-loader
Version:
Loads input data from Advent of Code
76 lines (75 loc) • 4.73 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const got_1 = __importDefault(require("got"));
const fs_1 = require("fs");
const utils_1 = require("ts-jest/utils");
const _1 = __importDefault(require("."));
jest.mock('fs', () => ({
promises: {
readFile: jest.fn().mockRejectedValue(Error("No such file or directory, open 'filename'")),
writeFile: jest.fn(),
},
}));
jest.mock('got', () => jest.fn().mockResolvedValue('Input from web'));
const readFileMock = (0, utils_1.mocked)(fs_1.promises.readFile);
const writeFileMock = (0, utils_1.mocked)(fs_1.promises.writeFile);
const gotMock = (0, utils_1.mocked)(got_1.default);
describe('aocLoader', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('should throw if no session token is given nor AOC_SESSION is set', () => __awaiter(void 0, void 0, void 0, function* () {
yield expect((0, _1.default)(2020, 1)).rejects.toThrow('No session provided or exist as the AOC_SESSION environment variable');
}));
it('should use the session argument before AOC_SESSION', () => __awaiter(void 0, void 0, void 0, function* () {
process.env.AOC_SESSION = 'env-var-token';
const sessionArgument = 'argument-token';
yield (0, _1.default)(2020, 1, sessionArgument);
expect(gotMock).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ headers: { Cookie: `session=${sessionArgument}` } }));
}));
it('should use the AOC_SESSION environment if no session argument is given', () => __awaiter(void 0, void 0, void 0, function* () {
const envVar = 'env-var-token';
process.env.AOC_SESSION = envVar;
yield (0, _1.default)(2020, 1);
expect(gotMock).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ headers: { Cookie: `session=${envVar}` } }));
}));
it('should throw if the input is not cached and request fails', () => __awaiter(void 0, void 0, void 0, function* () {
gotMock.mockRejectedValueOnce(Error('Failed to fetch input'));
yield expect((0, _1.default)(2020, 1, 'session-token')).rejects.toThrow('Failed to fetch AoC data for year 2020 day 1: Failed to fetch input');
}));
it('should not write to cache if request fails', () => __awaiter(void 0, void 0, void 0, function* () {
gotMock.mockRejectedValueOnce('Failed to fetch input');
yield expect((0, _1.default)(2020, 1, 'session-token')).rejects.toThrow();
expect(writeFileMock).not.toHaveBeenCalled();
}));
it('should fetch input data from adventofcode.com', () => __awaiter(void 0, void 0, void 0, function* () {
yield expect((0, _1.default)(2017, 25, 'session-token')).resolves.toEqual('Input from web');
expect(gotMock).toHaveBeenCalledWith('https://adventofcode.com/2017/day/25/input', expect.anything());
}));
it('should write to cache file if request is successful and cache does not exist', () => __awaiter(void 0, void 0, void 0, function* () {
yield expect((0, _1.default)(2020, 1, 'session-token')).resolves.toEqual('Input from web');
expect(writeFileMock).toHaveBeenCalledWith(expect.anything(), 'Input from web');
}));
it('should read cache file if it exist and not request input anew', () => __awaiter(void 0, void 0, void 0, function* () {
readFileMock.mockResolvedValueOnce(Buffer.from('Input from file', 'utf8'));
yield expect((0, _1.default)(2019, 5, 'session-token')).resolves.toEqual('Input from file');
expect(readFileMock).toHaveBeenCalled();
expect(gotMock).not.toHaveBeenCalled();
}));
it('should remove trailing newline from input', () => __awaiter(void 0, void 0, void 0, function* () {
gotMock.mockResolvedValueOnce('Input from web\n');
yield expect((0, _1.default)(2020, 1, 'session-token')).resolves.toEqual('Input from web');
}));
});