qiskit-documentation/scripts/js/lib/api/updateLinks.test.ts

335 lines
11 KiB
TypeScript

// This code is a Qiskit project.
//
// (C) Copyright IBM 2023.
//
// This code is licensed under the Apache License, Version 2.0. You may
// obtain a copy of this license in the LICENSE file in the root directory
// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
//
// Any modifications or derivative works of this code must retain this
// copyright notice, and modified files need to carry a notice indicating
// that they have been altered from the originals.
import { expect, test } from "@playwright/test";
import { ObjectsInv } from "./objectsInv";
import { updateLinks, normalizeUrl, relativizeLink } from "./updateLinks.js";
import { HtmlToMdResultWithUrl } from "./HtmlToMdResult.js";
test.describe("updateLinks", () => {
const data: HtmlToMdResultWithUrl[] = [
{
markdown: `
[link0](qiskit_ibm_runtime)
[link1](qiskit_ibm_runtime.RuntimeJob)
[link2](qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob)
[link3](qiskit_ibm_runtime.RuntimeJob.job#wut)
[link4](../stubs/qiskit_ibm_runtime.RuntimeJob)
[link5](../apidocs/qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob)
[link6](../apidocs/qiskit_ibm_runtime.RuntimeJob#SOME_VAR)
[link7](qiskit_ibm_runtime.RuntimeJob)
[link8](#qiskit_ibm_runtime.RuntimeJob.job)
[link9](https://qiskit.org/documentation/apidoc/algorithms.html)
[link10](https://qiskit.org/documentation/stubs/qiskit.circuit.BreakLoopOp.html#assemble)
[link11](qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob.a_method)
[link12](qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob.InlineClass.another_method)
`,
meta: {
apiType: "class",
apiName: "qiskit_ibm_runtime.RuntimeJob",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
images: [],
isReleaseNotes: false,
},
{
markdown: `
[run](qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob.run)
`,
meta: {
apiType: "class",
apiName: "qiskit_ibm_runtime.Sampler",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
images: [],
isReleaseNotes: false,
},
];
const objectsInvEntries = [
"stubs/qiskit.algorithms.Eigensolver#qiskit.algorithms.Eigensolver",
"stubs/qiskit.algorithms.EstimationProblem.html#qiskit.algorithms.EstimationProblem.state_preparation",
"stubs/qiskit.algorithms.FasterAmplitudeEstimationResult.html#qiskit.algorithms.FasterAmplitudeEstimationResult.success_probability",
"apidoc/qiskit_ibm_runtime#index",
"stubs/qiskit_ibm_runtime.QiskitRuntimeService",
"stubs/qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob.submit",
"stubs/qiskit_ibm_runtime.RuntimeEncoder#qiskit_ibm_runtime.RuntimeEncoder",
"stubs/qiskit_ibm_runtime.options.Options#options",
"qiskit.algorithms.gradients.LinCombEstimatorGradient#SUPPORTED_GATES",
].map((uri) => {
return {
name: "-",
domainAndRole: "-",
priority: "-",
uri,
dispname: "-",
};
});
const objectsInv = new ObjectsInv(
"# Here's a simple preamble",
objectsInvEntries,
);
test("no kebab-case", async () => {
await updateLinks(
data,
{ kebabCaseAndShorten: false, pkgName: "qiskit-ibm-runtime" },
objectsInv,
);
expect(data).toEqual([
{
images: [],
isReleaseNotes: false,
markdown: `[link0](qiskit_ibm_runtime)
[link1](qiskit_ibm_runtime.RuntimeJob)
[link2](qiskit_ibm_runtime.RuntimeJob)
[link3](qiskit_ibm_runtime.RuntimeJob#job)
[link4](qiskit_ibm_runtime.RuntimeJob)
[link5](qiskit_ibm_runtime.RuntimeJob)
[link6](qiskit_ibm_runtime.RuntimeJob#some_var)
[link7](qiskit_ibm_runtime.RuntimeJob)
[link8](#qiskit_ibm_runtime.RuntimeJob.job)
[link9](/docs/api/qiskit/algorithms)
[link10](/docs/api/qiskit/qiskit.circuit.BreakLoopOp#assemble)
[link11](qiskit_ibm_runtime.RuntimeJob#a_method)
[link12](qiskit_ibm_runtime.RuntimeJob#another_method)\n`,
meta: {
apiName: "qiskit_ibm_runtime.RuntimeJob",
apiType: "class",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
},
{
images: [],
isReleaseNotes: false,
markdown: "[run](qiskit_ibm_runtime.RuntimeJob#run)\n",
meta: {
apiName: "qiskit_ibm_runtime.Sampler",
apiType: "class",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
},
]);
expect(objectsInv.entries.map((e) => e.uri)).toEqual([
"qiskit.algorithms.Eigensolver#qiskit.algorithms.Eigensolver",
"qiskit.algorithms.EstimationProblem#qiskit.algorithms.EstimationProblem.state_preparation",
"qiskit.algorithms.FasterAmplitudeEstimationResult#qiskit.algorithms.FasterAmplitudeEstimationResult.success_probability",
"qiskit_ibm_runtime#index",
"qiskit_ibm_runtime.QiskitRuntimeService",
"qiskit_ibm_runtime.RuntimeJob#submit",
"qiskit_ibm_runtime.RuntimeEncoder#qiskit_ibm_runtime.RuntimeEncoder",
"qiskit_ibm_runtime.options.Options#options",
"qiskit.algorithms.gradients.LinCombEstimatorGradient#supported_gates",
]);
});
test("kebab-case", async () => {
await updateLinks(
data,
{ kebabCaseAndShorten: true, pkgName: "qiskit-ibm-runtime" },
objectsInv,
);
expect(data).toEqual([
{
images: [],
isReleaseNotes: false,
markdown: `[link0](qiskit-ibm-runtime)
[link1](runtime-job)
[link2](runtime-job)
[link3](runtime-job#job)
[link4](runtime-job)
[link5](runtime-job)
[link6](runtime-job#some_var)
[link7](runtime-job)
[link8](#qiskit_ibm_runtime.RuntimeJob.job)
[link9](/docs/api/qiskit/algorithms)
[link10](/docs/api/qiskit/qiskit.circuit.BreakLoopOp#assemble)
[link11](runtime-job#a_method)
[link12](runtime-job#another_method)\n`,
meta: {
apiName: "qiskit_ibm_runtime.RuntimeJob",
apiType: "class",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
},
{
images: [],
isReleaseNotes: false,
markdown: "[run](runtime-job#run)\n",
meta: {
apiName: "qiskit_ibm_runtime.Sampler",
apiType: "class",
},
url: "/docs/api/qiskit-ibm-runtime/qiskit_ibm_runtime.RuntimeJob",
},
]);
expect(objectsInv.entries.map((e) => e.uri)).toEqual([
"qiskit-algorithms-eigensolver#qiskit.algorithms.Eigensolver",
"qiskit-algorithms-estimation-problem#qiskit.algorithms.EstimationProblem.state_preparation",
"qiskit-algorithms-faster-amplitude-estimation-result#qiskit.algorithms.FasterAmplitudeEstimationResult.success_probability",
"qiskit-ibm-runtime#index",
"qiskit-runtime-service",
"runtime-job#submit",
"runtime-encoder#qiskit_ibm_runtime.RuntimeEncoder",
"options-options#options",
"qiskit-algorithms-gradients-lin-comb-estimator-gradient#supported_gates",
]);
});
});
test("normalizeUrl()", () => {
const urls = [
`qiskit_ibm_runtime`,
`qiskit_ibm_runtime.RuntimeJob`,
`qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob`,
`qiskit_ibm_runtime.RuntimeJob.job#wut`,
`../stubs/qiskit_ibm_runtime.RuntimeJob`,
`../apidocs/qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob`,
`qiskit_ibm_runtime.RuntimeJob`,
`#qiskit_ibm_runtime.RuntimeJob.job`,
`qiskit_ibm_runtime.RuntimeJob#qiskit_ibm_runtime.RuntimeJob.run`,
`stubs/qiskit_ibm_runtime.RuntimeJob`,
];
const resultsByName: { [key: string]: HtmlToMdResultWithUrl } = {
"qiskit_ibm_runtime.RuntimeJob": {
markdown: "",
meta: {
apiType: "class",
apiName: "qiskit_ibm_runtime.RuntimeJob",
},
url: "/docs/api/qiskit-ibm-runtime/stubs/qiskit_ibm_runtime.RuntimeJob",
images: [],
isReleaseNotes: false,
},
"qiskit_ibm_runtime.Sampler": {
markdown: "",
meta: {
apiType: "class",
apiName: "qiskit_ibm_runtime.Sampler",
},
url: "/docs/api/qiskit-ibm-runtime/stubs/qiskit_ibm_runtime.RuntimeJob",
images: [],
isReleaseNotes: false,
},
};
const itemNames = new Set(["qiskit_ibm_runtime.RuntimeJob"]);
const newUrls = urls.map((url) =>
normalizeUrl(url, resultsByName, itemNames, {
kebabCaseAndShorten: false,
pkgName: "qiskit-ibm-runtime",
}),
);
expect(newUrls).toEqual([
"qiskit_ibm_runtime",
"qiskit_ibm_runtime.RuntimeJob",
"qiskit_ibm_runtime.RuntimeJob",
"qiskit_ibm_runtime.RuntimeJob#job",
"qiskit_ibm_runtime.RuntimeJob",
"qiskit_ibm_runtime.RuntimeJob",
"qiskit_ibm_runtime.RuntimeJob",
"#qiskit_ibm_runtime.RuntimeJob.job",
"qiskit_ibm_runtime.RuntimeJob#run",
"qiskit_ibm_runtime.RuntimeJob",
]);
const kebabResults = urls.map((url) =>
normalizeUrl(url, resultsByName, itemNames, {
kebabCaseAndShorten: true,
pkgName: "qiskit-ibm-runtime",
}),
);
expect(kebabResults).toEqual([
"qiskit-ibm-runtime",
"runtime-job",
"runtime-job",
"runtime-job#job",
"runtime-job",
"runtime-job",
"runtime-job",
"#qiskit_ibm_runtime.RuntimeJob.job",
"runtime-job#run",
"runtime-job",
]);
});
test.describe("relativizeLink()", () => {
[
"https://ibm.com",
"https://qiskit.org/ecosystem/nature",
"https://qiskit.org/documentation/index.html",
"https://docs.quantum.ibm.com", // Note there is no `/` at the end.
].forEach((link) =>
test(`ignore irrelevant links - ${link}`, () => {
expect(relativizeLink({ url: link })).toBeUndefined();
}),
);
[
[
"https://qiskit.org/documentation/apidoc/algorithms.html",
"/api/qiskit/algorithms",
],
[
"https://qiskit.org/documentation/stubs/qiskit.circuit.BreakLoopOp.html",
"/api/qiskit/qiskit.circuit.BreakLoopOp",
],
[
"https://qiskit.org/documentation/apidoc/qiskit.circuit.BreakLoopOp.html#method",
"/api/qiskit/qiskit.circuit.BreakLoopOp#method",
],
[
"https://qiskit.org/documentation/apidoc/qiskit.circuit.BreakLoopOp.html#qiskit.circuit.BreakLoopOp",
"/api/qiskit/qiskit.circuit.BreakLoopOp",
],
].forEach(([input, expected]) =>
test(`relativize qiskit.org Qiskit API links - ${input}`, () => {
expect(relativizeLink({ url: input })).toEqual({ url: expected });
}),
);
[
["https://docs.quantum.ibm.com/run", "/run"],
["https://docs.quantum.ibm.com/api/qiskit/utils", "/api/qiskit/utils"],
["https://docs.quantum-computing.ibm.com/run", "/run"],
].forEach(([input, expected]) =>
test(`relativize docs.quantum.ibm.com links - ${input}`, () => {
expect(relativizeLink({ url: input })).toEqual({ url: expected });
}),
);
[
["https://quantum.cloud.ibm.com/docs", "/docs"],
[
"https://quantum.cloud.ibm.com/docs/api/qiskit/qiskit.transpiler.CouplingMap",
"/docs/api/qiskit/qiskit.transpiler.CouplingMap",
],
["https://quantum.cloud.ibm.com/learning", "/learning"],
[
"https://quantum.cloud.ibm.com/learning/courses/page",
"/learning/courses/page",
],
].forEach(([input, expected]) =>
test(`relativize quantum.cloud.ibm.com links - ${input}`, () => {
expect(relativizeLink({ url: input })).toEqual({ url: expected });
}),
);
test("update link text when the same as the URL", () => {
const url = "https://qiskit.org/documentation/apidoc/algorithms.html";
expect(relativizeLink({ url, text: url })?.text).toEqual("algorithms");
expect(relativizeLink({ url, text: "my text" })?.text).toBeUndefined();
});
});