import { describe, expect, it, LokaliseApiOta, Stub } from "../setup.js";

describe("OtaSdkTokens", () => {
	const token = process.env.API_JWT;
	const lokaliseApiOta = new LokaliseApiOta({ apiKey: process.env.API_JWT });
	const rootUrl = lokaliseApiOta.clientData.host;
	const teamId = 176692;
	const projectId = "88628569645b945648b474.25982965";
	const tokenId = 9709;

	it("handles errors", async () => {
		const fakeProjectId = "123.abc";
		const stub = new Stub({
			fixture: "ota_sdk_tokens/error_404.json",
			uri: `teams/${teamId}/projects/${fakeProjectId}/tokens`,
			version: "v3",
			skipApiToken: true,
			rootUrl,
			status: 404,
			reqHeaders: {
				Authorization: `Bearer ${token}`,
			},
		});

		await stub.setStub();

		await expect(
			lokaliseApiOta.otaSdkTokens().list({
				teamId: teamId,
				lokaliseProjectId: fakeProjectId,
			}),
		).rejects.toMatchObject({
			message: "Project not found",
			code: 404,
			details: { reason: "ENTITY_NOT_FOUND" },
		});
	});

	it("lists", async () => {
		const stub = new Stub({
			fixture: "ota_sdk_tokens/list.json",
			uri: `teams/${teamId}/projects/${projectId}/tokens`,
			version: "v3",
			skipApiToken: true,
			rootUrl,
			reqHeaders: {
				Authorization: `Bearer ${token}`,
			},
		});

		await stub.setStub();

		const tokens = await lokaliseApiOta.otaSdkTokens().list({
			teamId: teamId,
			lokaliseProjectId: projectId,
		});

		expect(tokens[0].id).to.eq(9690);
		expect(tokens.length).to.eq(3);
	});

	it("creates", async () => {
		const stub = new Stub({
			fixture: "ota_sdk_tokens/create.json",
			uri: `teams/${teamId}/projects/${projectId}/tokens`,
			version: "v3",
			skipApiToken: true,
			rootUrl,
			method: "POST",
			reqHeaders: {
				Authorization: `Bearer ${token}`,
			},
		});

		await stub.setStub();

		const createdToken = await lokaliseApiOta.otaSdkTokens().create({
			teamId: teamId,
			lokaliseProjectId: projectId,
		});

		expect(createdToken.id).to.eq(tokenId);
		expect(createdToken.token).to.eq("67aa2c0bd222669e192904edbb8081c3bf67");
		expect(createdToken.projectId).to.eq(188763);
		expect(createdToken.lokaliseId).to.eq(null);
		expect(createdToken.createdAt).to.eq("2023-09-23T11:57:09.486Z");
	});

	it("deletes", async () => {
		const stub = new Stub({
			fixture: "ota_sdk_tokens/delete.json",
			uri: `teams/${teamId}/projects/${projectId}/tokens/${tokenId}`,
			version: "v3",
			skipApiToken: true,
			rootUrl,
			method: "DELETE",
			reqHeaders: {
				Authorization: `Bearer ${token}`,
			},
		});

		await stub.setStub();

		const response = await lokaliseApiOta.otaSdkTokens().delete(tokenId, {
			teamId: teamId,
			lokaliseProjectId: projectId,
		});

		expect(response.id).to.eq(tokenId);
		expect(response.deleted).to.be.true;
	});
});
