41 lines
1.6 KiB
Python
41 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from app.services.github.client import parse_pull_request_url
|
|
|
|
|
|
def test_parse_pull_request_url_empty_is_none() -> None:
|
|
assert parse_pull_request_url("") is None
|
|
assert parse_pull_request_url(" ") is None
|
|
|
|
|
|
def test_parse_pull_request_url_non_github_is_none() -> None:
|
|
assert parse_pull_request_url("https://example.com/a/b/pull/1") is None
|
|
assert parse_pull_request_url("https://github.com/a/b/issues/1") is None
|
|
|
|
|
|
def test_parse_pull_request_url_valid_https_returns_canonical() -> None:
|
|
pr = parse_pull_request_url("https://github.com/acme/widgets/pull/123")
|
|
assert pr is not None
|
|
assert pr.owner == "acme"
|
|
assert pr.repo == "widgets"
|
|
assert pr.number == 123
|
|
assert pr.url == "https://github.com/acme/widgets/pull/123"
|
|
|
|
|
|
def test_parse_pull_request_url_http_normalizes_to_canonical() -> None:
|
|
pr = parse_pull_request_url("http://github.com/acme/widgets/pull/123")
|
|
assert pr is not None
|
|
assert pr.url == "https://github.com/acme/widgets/pull/123"
|
|
|
|
|
|
def test_parse_pull_request_url_invalid_number_is_none() -> None:
|
|
assert parse_pull_request_url("https://github.com/acme/widgets/pull/0") is None
|
|
assert parse_pull_request_url("https://github.com/acme/widgets/pull/-1") is None
|
|
assert parse_pull_request_url("https://github.com/acme/widgets/pull/not-a-number") is None
|
|
|
|
|
|
def test_parse_pull_request_url_extra_segments_still_parses() -> None:
|
|
pr = parse_pull_request_url("https://github.com/acme/widgets/pull/123/files")
|
|
assert pr is not None
|
|
assert pr.url == "https://github.com/acme/widgets/pull/123"
|