174 lines
5.2 KiB
TypeScript
174 lines
5.2 KiB
TypeScript
import { describe, it, expect } from "vite-plus/test";
|
|
import {
|
|
generateGitHubContent,
|
|
generateMailtoUrl,
|
|
generateDebugFile,
|
|
MAX_MAIL_TITLE_LENGTH,
|
|
MAX_MAIL_DESCRIPTION_LENGTH,
|
|
} from "./template";
|
|
import type { IssueData, Sections } from "./types";
|
|
|
|
describe("Issue Utils", () => {
|
|
const mockIssueData: IssueData = {
|
|
title: "Test Issue",
|
|
description: "This is a test description",
|
|
steps: "1. Do something\n2. See error",
|
|
version: "v1.0.0",
|
|
system: "Linux/amd64",
|
|
timezone: "MST -07:00",
|
|
};
|
|
|
|
const mockSections: Sections = {
|
|
yamlConfig: { included: true, content: "key: value\nother: test" },
|
|
uiConfig: { included: true, content: '{"setting": "value"}' },
|
|
state: { included: false, content: "" },
|
|
logs: { included: true, content: "2023-01-01 ERROR: Something went wrong" },
|
|
};
|
|
|
|
describe("generateGitHubContent", () => {
|
|
it("generates body with additional content", () => {
|
|
const result = generateGitHubContent(mockIssueData, mockSections);
|
|
|
|
expect(result.body).toBe(`## Description
|
|
|
|
This is a test description
|
|
|
|
## Steps to Reproduce
|
|
|
|
1. Do something
|
|
2. See error
|
|
|
|
## Configuration (YAML)
|
|
|
|
\`\`\`yaml
|
|
key: value
|
|
other: test
|
|
\`\`\`
|
|
|
|
## Configuration (UI)
|
|
|
|
\`\`\`json5
|
|
{"setting": "value"}
|
|
\`\`\`
|
|
|
|
## Logs
|
|
|
|
\`\`\`
|
|
2023-01-01 ERROR: Something went wrong
|
|
\`\`\`
|
|
|
|
## Version
|
|
|
|
v1.0.0
|
|
|
|
## System
|
|
|
|
Linux/amd64, MST -07:00`);
|
|
expect(result.additional).toBeUndefined();
|
|
});
|
|
|
|
it("uses placeholder when exceeding limit", () => {
|
|
const longContent = "x".repeat(8000);
|
|
const longSections: Sections = {
|
|
...mockSections,
|
|
yamlConfig: {
|
|
included: true,
|
|
content: longContent,
|
|
},
|
|
};
|
|
|
|
const result = generateGitHubContent(mockIssueData, longSections);
|
|
|
|
expect(result.body).toContain("⚠️ RETURN TO EVCC TAB → COPY STEP 2 → PASTE HERE");
|
|
expect(result.body).not.toContain("## Configuration (YAML)");
|
|
expect(result.additional).toBeDefined();
|
|
expect(result.additional).toContain(longContent);
|
|
});
|
|
|
|
it("handles empty steps", () => {
|
|
const issueWithoutSteps: IssueData = {
|
|
...mockIssueData,
|
|
steps: "",
|
|
};
|
|
|
|
const result = generateGitHubContent(issueWithoutSteps, mockSections);
|
|
|
|
expect(result.body).toContain("## Steps to Reproduce");
|
|
expect(result.body).toContain("## Steps to Reproduce\n\n\n\n## Configuration");
|
|
expect(result.body).toContain("## Configuration (YAML)");
|
|
});
|
|
|
|
it("includes only enabled sections", () => {
|
|
const selectiveSections: Sections = {
|
|
yamlConfig: { included: true, content: "yaml: content" },
|
|
uiConfig: { included: false, content: "ui: content" },
|
|
state: { included: true, content: "state: content" },
|
|
logs: { included: false, content: "log: content" },
|
|
};
|
|
|
|
const result = generateGitHubContent(mockIssueData, selectiveSections);
|
|
|
|
expect(result.body).toContain("## Configuration (YAML)");
|
|
expect(result.body).toContain("## System State");
|
|
expect(result.body).not.toContain("## Configuration (UI)");
|
|
expect(result.body).not.toContain("## Logs");
|
|
});
|
|
|
|
it("handles all sections disabled", () => {
|
|
const emptySections: Sections = {
|
|
yamlConfig: { included: false, content: "" },
|
|
uiConfig: { included: false, content: "" },
|
|
state: { included: false, content: "" },
|
|
logs: { included: false, content: "" },
|
|
};
|
|
|
|
const result = generateGitHubContent(mockIssueData, emptySections);
|
|
|
|
expect(result.body).not.toContain("## Configuration");
|
|
expect(result.body).not.toContain("## System State");
|
|
expect(result.body).not.toContain("## Logs");
|
|
});
|
|
});
|
|
|
|
describe("generateMailtoUrl", () => {
|
|
it("generates plaintext mailto url without steps or diagnostics", () => {
|
|
const url = generateMailtoUrl("support@example.com", mockIssueData);
|
|
|
|
expect(url).toContain("mailto:support@example.com?subject=Test%20Issue&body=");
|
|
const body = decodeURIComponent(url.split("&body=")[1]);
|
|
expect(body).toBe(`This is a test description
|
|
|
|
Version: v1.0.0
|
|
|
|
System: Linux/amd64, MST -07:00`);
|
|
});
|
|
|
|
it("stays below the windows mailto limit at maximum input length", () => {
|
|
// umlaut-dense german text, each umlaut costs 6 chars percent-encoded
|
|
const text = "Fehlermeldung: Ladepunkt überprüfen, Zählerstände größer als üblich. ";
|
|
const fill = (length: number) =>
|
|
text.repeat(Math.ceil(length / text.length)).slice(0, length);
|
|
|
|
const url = generateMailtoUrl("support@installer-example.com", {
|
|
...mockIssueData,
|
|
title: fill(MAX_MAIL_TITLE_LENGTH),
|
|
description: fill(MAX_MAIL_DESCRIPTION_LENGTH),
|
|
});
|
|
|
|
expect(url.length).toBeLessThan(2000);
|
|
});
|
|
});
|
|
|
|
describe("generateDebugFile", () => {
|
|
it("contains version, system and enabled sections", () => {
|
|
const content = generateDebugFile(mockIssueData, mockSections);
|
|
|
|
expect(content).toContain("# evcc debug information");
|
|
expect(content).toContain("Version: v1.0.0");
|
|
expect(content).toContain("System: Linux/amd64, MST -07:00");
|
|
expect(content).toContain("## Configuration (YAML)");
|
|
expect(content).toContain("## Logs");
|
|
expect(content).not.toContain("## System State");
|
|
});
|
|
});
|
|
});
|