Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(checkboxes): correctly parse checkboxes when the template is wrong or missing #71

Merged
merged 1 commit into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions fixtures/mismatched-parsing/expected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"your_contact_details": "[email protected]",
"what_happened": "A bug happened!",
"version": "1.0.0",
"what_browsers_are_you_seeing_the_problem_on": "Chrome, Safari",
"what_else": ["Never give up"],
"and_with_that": ["Hot Dog is a Sandwich", "Another item"],
"checkbox_without_an_id": []
}
16 changes: 16 additions & 0 deletions fixtures/mismatched-parsing/form.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
body:
- type: input
id: favorite_dish
attributes:
label: What's your favorite dish?
validations:
required: true

- type: checkboxes
id: favorite_color
attributes:
label: What's your preferred color?
options:
- label: Red
- label: Green
- label: Blue
31 changes: 31 additions & 0 deletions fixtures/mismatched-parsing/issue-body.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
### Your contact details

[email protected]

### What happened?

A bug happened!

### Version

1.0.0

### What browsers are you seeing the problem on?

Chrome, Safari

### What else?

- [x] Never give up
- [ ] Hot Dog is a Sandwich

### And with that?

- [] Never give up
- [X] Hot Dog is a Sandwich
- [x] Another item

### Checkbox without an id?

- [ ] IDs are great
- [ ] IDs are bad
6 changes: 6 additions & 0 deletions fixtures/mismatched-parsing/issue.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const { resolve } = require("path");
const { readFileSync } = require("fs");

const issueBodyPath = resolve(__dirname, "issue-body.md");

module.exports = readFileSync(issueBodyPath, "utf-8");
5 changes: 4 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ async function run(env, body, fs, core) {
if (key in result) {
const content = result[key];

if (value !== undefined) {
if (content !== undefined && value !== undefined) {
result[key] = content.concat(value);
}
return;
Expand Down Expand Up @@ -127,6 +127,9 @@ async function run(env, body, fs, core) {
const field = check.replace(/- \[[X\s]\]\s+/i, "");
const previousIndex = index === 0 ? index : index - 1;
const key = arr[previousIndex].trim();
// set the type of the field to checkboxes to ensure that values will be represented as an array
// even when issue-form template is not provided or wrong template is provided
idTypes[toKey(key)] = "checkboxes";
if (check.toUpperCase().startsWith("- [X] ")) {
return [key, field];
}
Expand Down
44 changes: 44 additions & 0 deletions test.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,50 @@ it("full example", () => {
expect(core.setOutput.mock.calls.length).toBe(8)
});

it("mismatched parsing", () => {
const expectedOutput = require("./fixtures/mismatched-parsing/expected.json");
const expectedOutputJson = JSON.stringify(expectedOutput, null, 2);

// mock ENV
const env = {
HOME: "<home path>",
};

// mock event payload
const eventPayload = require("./fixtures/mismatched-parsing/issue");

// mock fs
const fs = {
readFileSync(path, encoding) {
expect(path).toBe("<template-path>");
expect(encoding).toBe("utf8");
return readFileSync("fixtures/mismatched-parsing/form.yml", "utf-8");
},
writeFileSync(path, content) {
expect(path).toBe("<home path>/issue-parser-result.json");
expect(content).toBe(expectedOutputJson);
},
};

// mock core
const core = {
getInput: jest.fn(() => '<template-path>'),
setOutput: jest.fn(),
};

run(env, eventPayload, fs, core);
expect(core.getInput).toHaveBeenCalledWith('template-path')
expect(core.setOutput).toHaveBeenCalledWith('jsonString', JSON.stringify(expectedOutput, null, 2))
expect(core.setOutput).toHaveBeenCalledWith('issueparser_your_contact_details', '[email protected]')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_what_happened', 'A bug happened!')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_version', '1.0.0')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_what_browsers_are_you_seeing_the_problem_on', 'Chrome, Safari')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_what_else', 'Never give up')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_and_with_that', 'Hot Dog is a Sandwich,Another item')
expect(core.setOutput).toHaveBeenCalledWith('issueparser_checkbox_without_an_id', '')
expect(core.setOutput.mock.calls.length).toBe(8)
});

it("multiple paragraphs", () => {
const expectedOutput = require("./fixtures/multiple-paragraphs/expected.json");
const expectedOutputJson = JSON.stringify(expectedOutput, null, 2);
Expand Down