testeranto 0.158.0 → 0.159.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/testeranto/App.js CHANGED
@@ -31522,198 +31522,38 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
31522
31522
  // src/utils/api.ts
31523
31523
  var fetchTestData = async (projectName, filepath, runTime) => {
31524
31524
  const basePath = `reports/${projectName}/${filepath.split(".").slice(0, -1).join(".")}/${runTime}`;
31525
- const [testRes, logsRes, typeRes, lintRes] = await Promise.all([
31526
- fetch(`${basePath}/tests.json`),
31527
- fetch(`${basePath}/logs.txt`),
31528
- fetch(`${basePath}/type_errors.txt`),
31529
- fetch(`${basePath}/lint_errors.txt`)
31530
- ]);
31531
- return {
31532
- // testData: await testRes.json(),
31533
- testData: fakeTestJson,
31534
- logs: await logsRes.text(),
31535
- typeErrors: await typeRes.text(),
31536
- lintErrors: await lintRes.text()
31537
- };
31538
- };
31539
- var fakeTestJson = {
31540
- name: "Testing the Rectangle class",
31541
- givens: [
31542
- {
31543
- key: "test0",
31544
- name: "Default",
31545
- whens: [
31546
- {
31547
- name: "setWidth: 4",
31548
- error: true
31549
- },
31550
- {
31551
- name: "setHeight: 19",
31552
- error: true
31553
- }
31554
- ],
31555
- thens: [
31556
- {
31557
- name: "getWidth: 4",
31558
- error: false
31559
- },
31560
- {
31561
- name: "getHeight: 19",
31562
- error: false
31563
- }
31564
- ],
31565
- error: null,
31566
- features: [
31567
- "https://api.github.com/repos/adamwong246/testeranto/issues/8"
31568
- ]
31569
- },
31570
- {
31571
- key: "test1",
31572
- name: "Default",
31573
- whens: [
31574
- {
31575
- name: "setWidth: 4",
31576
- error: true
31577
- },
31578
- {
31579
- name: "setHeight: 5",
31580
- error: true
31581
- }
31582
- ],
31583
- thens: [
31584
- {
31585
- name: "getWidth: 4",
31586
- error: false
31587
- },
31588
- {
31589
- name: "getHeight: 5",
31590
- error: false
31591
- },
31592
- {
31593
- name: "area: 20",
31594
- error: false
31595
- },
31596
- {
31597
- name: "AreaPlusCircumference: 38",
31598
- error: false
31599
- }
31600
- ],
31601
- error: null,
31602
- features: ["Rectangles have width and height."]
31603
- },
31604
- {
31605
- key: "test2",
31606
- name: "Default",
31607
- whens: [
31608
- {
31609
- name: "setHeight: 4",
31610
- error: true
31611
- },
31612
- {
31613
- name: "setWidth: 33",
31614
- error: true
31615
- }
31616
- ],
31617
- thens: [
31618
- {
31619
- name: "area: 132",
31620
- error: false
31621
- }
31622
- ],
31623
- error: null,
31624
- features: ["Rectangles have area"]
31625
- },
31626
- {
31627
- key: "test2_1",
31628
- name: "Default",
31629
- whens: [],
31630
- thens: [
31631
- {
31632
- name: "getWidth: 2",
31633
- error: false
31634
- },
31635
- {
31636
- name: "getHeight: 2",
31637
- error: false
31638
- }
31639
- ],
31640
- error: null,
31641
- features: ["Rectangles have default size"]
31642
- },
31643
- {
31644
- key: "test3",
31645
- name: "Default",
31646
- whens: [
31647
- {
31648
- name: "setHeight: 5",
31649
- error: true
31650
- },
31651
- {
31652
- name: "setWidth: 5",
31653
- error: true
31654
- }
31655
- ],
31656
- thens: [
31657
- {
31658
- name: "area: 25",
31659
- error: false
31660
- }
31661
- ],
31662
- error: null,
31663
- features: [
31664
- "file:///Users/adam/Code/testeranto-starter/src/Rectangle/README.md"
31665
- ]
31666
- },
31667
- {
31668
- key: "test4",
31669
- name: "Default",
31670
- whens: [
31671
- {
31672
- name: "setHeight: 6",
31673
- error: true
31674
- },
31675
- {
31676
- name: "setWidth: 6",
31677
- error: true
31678
- }
31679
- ],
31680
- thens: [
31681
- {
31682
- name: "area: 36",
31683
- error: false
31684
- }
31685
- ],
31686
- error: null,
31687
- features: ["Rectangles have area"]
31688
- },
31689
- {
31690
- key: "test5",
31691
- name: "Default",
31692
- whens: [],
31693
- thens: [
31694
- {
31695
- name: "getWidth: 2",
31696
- error: false
31697
- },
31698
- {
31699
- name: "getHeight: 2",
31700
- error: false
31701
- }
31702
- ],
31703
- error: null,
31704
- features: ["Rectangles have default size, again"]
31525
+ try {
31526
+ const [testRes, logsRes, typeRes, lintRes] = await Promise.all([
31527
+ fetch(`${basePath}/tests.json`),
31528
+ fetch(`${basePath}/logs.txt`),
31529
+ fetch(`${basePath}/type_errors.txt`),
31530
+ fetch(`${basePath}/lint_errors.txt`)
31531
+ ]);
31532
+ if (!testRes.ok) {
31533
+ return {
31534
+ testData: null,
31535
+ logs: await logsRes.text(),
31536
+ typeErrors: await typeRes.text(),
31537
+ lintErrors: await lintRes.text(),
31538
+ error: "Tests did not complete successfully. Please check the build and runtime logs for errors."
31539
+ };
31705
31540
  }
31706
- ],
31707
- checks: [],
31708
- fails: 0,
31709
- features: [
31710
- "https://api.github.com/repos/adamwong246/testeranto/issues/8",
31711
- "Rectangles have width and height.",
31712
- "Rectangles have area",
31713
- "Rectangles have default size",
31714
- "file:///Users/adam/Code/testeranto-starter/src/Rectangle/README.md",
31715
- "Rectangles have default size, again"
31716
- ]
31541
+ return {
31542
+ testData: await testRes.json(),
31543
+ logs: await logsRes.text(),
31544
+ typeErrors: await typeRes.text(),
31545
+ lintErrors: await lintRes.text(),
31546
+ error: null
31547
+ };
31548
+ } catch (err) {
31549
+ return {
31550
+ testData: null,
31551
+ logs: "",
31552
+ typeErrors: "",
31553
+ lintErrors: "",
31554
+ error: `Failed to load test data: ${err instanceof Error ? err.message : String(err)}`
31555
+ };
31556
+ }
31717
31557
  };
31718
31558
 
31719
31559
  // src/TestPage.tsx
@@ -31736,6 +31576,13 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
31736
31576
  const [lintErrors, setLintErrors] = (0, import_react54.useState)("");
31737
31577
  const [loading, setLoading] = (0, import_react54.useState)(true);
31738
31578
  const [error, setError] = (0, import_react54.useState)(null);
31579
+ const [testsExist, setTestsExist] = (0, import_react54.useState)(true);
31580
+ const [errorCounts, setErrorCounts] = (0, import_react54.useState)({
31581
+ typeErrors: 0,
31582
+ staticErrors: 0,
31583
+ runTimeErrors: 0
31584
+ });
31585
+ const [summary, setSummary] = (0, import_react54.useState)(null);
31739
31586
  const { projectName, "*": splat } = useParams();
31740
31587
  const pathParts = splat ? splat.split("/") : [];
31741
31588
  const runtime = pathParts.pop() || "";
@@ -31747,13 +31594,33 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
31747
31594
  setTestName(testPath);
31748
31595
  const fetchData = async () => {
31749
31596
  try {
31750
- const { testData: testData2, logs: logs2, typeErrors: typeErrors2, lintErrors: lintErrors2 } = await fetchTestData(projectName, testPath, runtime);
31751
- setTestData(testData2);
31752
- setLogs(logs2);
31753
- setTypeErrors(typeErrors2);
31754
- setLintErrors(lintErrors2);
31597
+ const testResponse = await fetchTestData(projectName, testPath, runtime);
31598
+ setTestData(testResponse.testData);
31599
+ setTestsExist(!!testResponse.testData);
31600
+ setLogs(testResponse.logs);
31601
+ setTypeErrors(testResponse.typeErrors);
31602
+ setLintErrors(testResponse.lintErrors);
31603
+ try {
31604
+ const summaryResponse = await fetch(`reports/${projectName}/summary.json`);
31605
+ if (!summaryResponse.ok)
31606
+ throw new Error("Failed to fetch summary");
31607
+ const allSummaries = await summaryResponse.json();
31608
+ const testSummary = allSummaries[testPath];
31609
+ console.log("testSummary", testSummary);
31610
+ if (testSummary) {
31611
+ setSummary(testSummary);
31612
+ setErrorCounts({
31613
+ typeErrors: testSummary.typeErrors || 0,
31614
+ staticErrors: testSummary.staticErrors || 0,
31615
+ runTimeErrors: testSummary.runTimeErrors || 0
31616
+ });
31617
+ }
31618
+ } catch (err) {
31619
+ console.error("Failed to load summary:", err);
31620
+ }
31755
31621
  } catch (err) {
31756
31622
  setError(err instanceof Error ? err.message : "Unknown error");
31623
+ setTestsExist(false);
31757
31624
  } finally {
31758
31625
  setLoading(false);
31759
31626
  }
@@ -31772,22 +31639,22 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
31772
31639
  navItems: [
31773
31640
  {
31774
31641
  to: `#results`,
31775
- label: testData?.givens.some((g) => g.whens.some((w) => w.error) || g.thens.some((t) => t.error)) ? "\u274C BDD" : "\u2705 BDD",
31642
+ label: !testsExist ? "\u274C BDD" : testData?.givens.some((g) => g.whens.some((w) => w.error) || g.thens.some((t) => t.error)) ? "\u274C BDD" : "\u2705 BDD",
31776
31643
  active: route === "results"
31777
31644
  },
31778
31645
  {
31779
31646
  to: `#logs`,
31780
- label: logs?.includes("error") || logs?.includes("fail") ? "\u274C Logs" : "\u2705 Logs",
31647
+ label: `Runtime logs`,
31781
31648
  active: route === "logs"
31782
31649
  },
31783
31650
  {
31784
31651
  to: `#types`,
31785
- label: typeErrors ? `\u274C ${typeErrors.split("\n").filter((l) => l.includes("error")).length} Type Errors` : "\u2705 Type check",
31652
+ label: errorCounts.typeErrors > 0 ? `tsc (\u274C * ${errorCounts.typeErrors})` : "tsc \u2705 ",
31786
31653
  active: route === "types"
31787
31654
  },
31788
31655
  {
31789
31656
  to: `#lint`,
31790
- label: lintErrors ? `\u274C ${lintErrors.split("\n").filter((l) => l.includes("error")).length} Lint Errors` : "\u2705 Lint",
31657
+ label: errorCounts.staticErrors > 0 ? `eslint (\u274C *${errorCounts.staticErrors}) ` : "eslint \u2705",
31791
31658
  active: route === "lint"
31792
31659
  }
31793
31660
  ],
@@ -31806,7 +31673,22 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
31806
31673
  setRoute(k);
31807
31674
  navigate(`#${k}`, { replace: true });
31808
31675
  }
31809
- } }, /* @__PURE__ */ import_react54.default.createElement(Tab_default.Content, { className: "mt-3" }, /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "results" }, testData ? /* @__PURE__ */ import_react54.default.createElement("div", { className: "test-results" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "mb-3" }), testData.givens.map((given, i) => /* @__PURE__ */ import_react54.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "Given: ", given.name)), /* @__PURE__ */ import_react54.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react54.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react54.default.createElement("strong", null, "When:"), " ", when.name, when.error && /* @__PURE__ */ import_react54.default.createElement("pre", { className: "mt-2" }, when.error))), given.thens.map((then, k) => /* @__PURE__ */ import_react54.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react54.default.createElement("strong", null, "Then:"), " ", then.name, then.error && /* @__PURE__ */ import_react54.default.createElement("pre", { className: "mt-2" }, then.error))))))) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No test results found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "logs" }, logs ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, logs) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No runtime logs found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "types" }, typeErrors ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, typeErrors) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No type errors found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "lint" }, lintErrors ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, lintErrors) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No lint errors found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "coverage" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "coverage-report" }, /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "info" }, "Coverage reports coming soon!"), /* @__PURE__ */ import_react54.default.createElement("div", { className: "coverage-stats" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-success text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "85%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Lines Covered")), /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-warning text-dark" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "72%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Branches Covered")), /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-info text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "91%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Functions Covered"))))))));
31676
+ } }, /* @__PURE__ */ import_react54.default.createElement(Tab_default.Content, { className: "mt-3" }, /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "results" }, !testsExist ? /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "danger", className: "mt-3" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "Tests did not run to completion"), /* @__PURE__ */ import_react54.default.createElement("p", null, "The test results file (tests.json) was not found or could not be loaded."), /* @__PURE__ */ import_react54.default.createElement("div", { className: "mt-3" }, /* @__PURE__ */ import_react54.default.createElement(
31677
+ Button_default2,
31678
+ {
31679
+ variant: "outline-light",
31680
+ onClick: () => setRoute("logs"),
31681
+ className: "me-2"
31682
+ },
31683
+ "View Runtime Logs"
31684
+ ), /* @__PURE__ */ import_react54.default.createElement(
31685
+ Button_default2,
31686
+ {
31687
+ variant: "outline-light",
31688
+ onClick: () => navigate(`/projects/${projectName}#${runtime}`)
31689
+ },
31690
+ "View Build Logs"
31691
+ ))) : testData ? /* @__PURE__ */ import_react54.default.createElement("div", { className: "test-results" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "mb-3" }), testData.givens.map((given, i) => /* @__PURE__ */ import_react54.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "Given: ", given.name)), /* @__PURE__ */ import_react54.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react54.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react54.default.createElement("strong", null, "When:"), " ", when.name, when.error && /* @__PURE__ */ import_react54.default.createElement("pre", { className: "mt-2" }, when.error))), given.thens.map((then, k) => /* @__PURE__ */ import_react54.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react54.default.createElement("strong", null, "Then:"), " ", then.name, then.error && /* @__PURE__ */ import_react54.default.createElement("pre", { className: "mt-2" }, then.error))))))) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No test results found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "logs" }, logs ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, logs) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No runtime logs found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "types" }, typeErrors ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, typeErrors) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No type errors found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "lint" }, lintErrors ? /* @__PURE__ */ import_react54.default.createElement("pre", { className: "bg-dark text-white p-3" }, lintErrors) : /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "warning" }, "No lint errors found")), /* @__PURE__ */ import_react54.default.createElement(Tab_default.Pane, { eventKey: "coverage" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "coverage-report" }, /* @__PURE__ */ import_react54.default.createElement(Alert_default, { variant: "info" }, "Coverage reports coming soon!"), /* @__PURE__ */ import_react54.default.createElement("div", { className: "coverage-stats" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-success text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "85%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Lines Covered")), /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-warning text-dark" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "72%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Branches Covered")), /* @__PURE__ */ import_react54.default.createElement("div", { className: "stat-card bg-info text-white" }, /* @__PURE__ */ import_react54.default.createElement("h4", null, "91%"), /* @__PURE__ */ import_react54.default.createElement("p", null, "Functions Covered"))))))));
31810
31692
  };
31811
31693
 
31812
31694
  // src/App.tsx