mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-25 21:36:52 +08:00
Co-authored-by: openhands <openhands@all-hands.dev> Co-authored-by: Engel Nyst <engel.nyst@gmail.com> Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
143 lines
4.7 KiB
TypeScript
143 lines
4.7 KiB
TypeScript
import { describe, it, expect } from "vitest";
|
|
import {
|
|
extractPRUrls,
|
|
containsPRUrl,
|
|
getFirstPRUrl,
|
|
} from "#/utils/parse-pr-url";
|
|
|
|
describe("parse-pr-url", () => {
|
|
describe("extractPRUrls", () => {
|
|
it("should extract GitHub PR URLs", () => {
|
|
const text = "Check out this PR: https://github.com/owner/repo/pull/123";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual(["https://github.com/owner/repo/pull/123"]);
|
|
});
|
|
|
|
it("should extract GitLab MR URLs", () => {
|
|
const text =
|
|
"Merge request: https://gitlab.com/owner/repo/-/merge_requests/456";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual([
|
|
"https://gitlab.com/owner/repo/-/merge_requests/456",
|
|
]);
|
|
});
|
|
|
|
it("should extract Bitbucket PR URLs", () => {
|
|
const text =
|
|
"PR link: https://bitbucket.org/owner/repo/pull-requests/789";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual([
|
|
"https://bitbucket.org/owner/repo/pull-requests/789",
|
|
]);
|
|
});
|
|
|
|
it("should extract Azure DevOps PR URLs", () => {
|
|
const text =
|
|
"Azure PR: https://dev.azure.com/org/project/_git/repo/pullrequest/101";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual([
|
|
"https://dev.azure.com/org/project/_git/repo/pullrequest/101",
|
|
]);
|
|
});
|
|
|
|
it("should extract multiple PR URLs", () => {
|
|
const text = `
|
|
GitHub: https://github.com/owner/repo/pull/123
|
|
GitLab: https://gitlab.com/owner/repo/-/merge_requests/456
|
|
`;
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toHaveLength(2);
|
|
expect(urls).toContain("https://github.com/owner/repo/pull/123");
|
|
expect(urls).toContain(
|
|
"https://gitlab.com/owner/repo/-/merge_requests/456",
|
|
);
|
|
});
|
|
|
|
it("should handle self-hosted GitLab URLs", () => {
|
|
const text =
|
|
"Self-hosted: https://gitlab.example.com/owner/repo/-/merge_requests/123";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual([
|
|
"https://gitlab.example.com/owner/repo/-/merge_requests/123",
|
|
]);
|
|
});
|
|
|
|
it("should return empty array when no PR URLs found", () => {
|
|
const text = "This is just regular text with no PR URLs";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual([]);
|
|
});
|
|
|
|
it("should handle URLs with HTTP instead of HTTPS", () => {
|
|
const text = "HTTP PR: http://github.com/owner/repo/pull/123";
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual(["http://github.com/owner/repo/pull/123"]);
|
|
});
|
|
|
|
it("should remove duplicate URLs", () => {
|
|
const text = `
|
|
Same PR mentioned twice:
|
|
https://github.com/owner/repo/pull/123
|
|
https://github.com/owner/repo/pull/123
|
|
`;
|
|
const urls = extractPRUrls(text);
|
|
expect(urls).toEqual(["https://github.com/owner/repo/pull/123"]);
|
|
});
|
|
});
|
|
|
|
describe("containsPRUrl", () => {
|
|
it("should return true when PR URL is present", () => {
|
|
const text = "Check out this PR: https://github.com/owner/repo/pull/123";
|
|
expect(containsPRUrl(text)).toBe(true);
|
|
});
|
|
|
|
it("should return false when no PR URL is present", () => {
|
|
const text = "This is just regular text";
|
|
expect(containsPRUrl(text)).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("getFirstPRUrl", () => {
|
|
it("should return the first PR URL found", () => {
|
|
const text = `
|
|
First: https://github.com/owner/repo/pull/123
|
|
Second: https://gitlab.com/owner/repo/-/merge_requests/456
|
|
`;
|
|
const url = getFirstPRUrl(text);
|
|
expect(url).toBe("https://github.com/owner/repo/pull/123");
|
|
});
|
|
|
|
it("should return null when no PR URL is found", () => {
|
|
const text = "This is just regular text";
|
|
const url = getFirstPRUrl(text);
|
|
expect(url).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe("real-world scenarios", () => {
|
|
it("should handle typical microagent finish messages", () => {
|
|
const text = `
|
|
I have successfully created a pull request with the requested changes.
|
|
You can view the PR here: https://github.com/OpenHands/OpenHands/pull/1234
|
|
|
|
The changes include:
|
|
- Updated the component
|
|
- Added tests
|
|
- Fixed the issue
|
|
`;
|
|
const url = getFirstPRUrl(text);
|
|
expect(url).toBe("https://github.com/OpenHands/OpenHands/pull/1234");
|
|
});
|
|
|
|
it("should handle messages with PR URLs in the middle", () => {
|
|
const text = `
|
|
Task completed successfully! I've created a pull request at
|
|
https://github.com/owner/repo/pull/567 with all the requested changes.
|
|
Please review when you have a chance.
|
|
`;
|
|
const url = getFirstPRUrl(text);
|
|
expect(url).toBe("https://github.com/owner/repo/pull/567");
|
|
});
|
|
});
|
|
});
|