package api import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParsePageURL_ViewPageAction(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com/pages/viewpage.action?pageId=12345") require.NoError(t, err) assert.Equal(t, "https://confluence.example.com", ref.BaseURL) assert.Equal(t, "12345", ref.PageID) assert.Empty(t, ref.SpaceKey) assert.Empty(t, ref.Title) } func TestParsePageURL_ViewPageActionWithPort(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com:8443/pages/viewpage.action?pageId=99") require.NoError(t, err) assert.Equal(t, "https://confluence.example.com:8443", ref.BaseURL) assert.Equal(t, "99", ref.PageID) } func TestParsePageURL_DisplayFormat(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com/display/TEAM/My+Page+Title") require.NoError(t, err) assert.Equal(t, "https://confluence.example.com", ref.BaseURL) assert.Empty(t, ref.PageID) assert.Equal(t, "TEAM", ref.SpaceKey) assert.Equal(t, "My Page Title", ref.Title) } func TestParsePageURL_DisplayFormatEncodedTitle(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com/display/DEV/API+%26+SDK+Guide") require.NoError(t, err) assert.Equal(t, "DEV", ref.SpaceKey) assert.Equal(t, "API & SDK Guide", ref.Title) } func TestParsePageURL_DisplayFormatTrailingSlash(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com/display/TEAM/Page/") require.NoError(t, err) assert.Equal(t, "TEAM", ref.SpaceKey) assert.Equal(t, "Page", ref.Title) } func TestParsePageURL_ViewPageNoPageID(t *testing.T) { _, err := ParsePageURL("https://confluence.example.com/pages/viewpage.action") require.Error(t, err) assert.Contains(t, err.Error(), "pageId") } func TestParsePageURL_DisplayFormatNoTitle(t *testing.T) { _, err := ParsePageURL("https://confluence.example.com/display/SPACE") require.Error(t, err) assert.Contains(t, err.Error(), "Title") } func TestParsePageURL_NoScheme(t *testing.T) { _, err := ParsePageURL("confluence.example.com/display/SPACE/Page") require.Error(t, err) } func TestParsePageURL_UnrecognizedFormat(t *testing.T) { _, err := ParsePageURL("https://confluence.example.com/some/other/path") require.Error(t, err) assert.Contains(t, err.Error(), "unrecognized") } func TestParsePageURL_SubPage(t *testing.T) { ref, err := ParsePageURL("https://confluence.example.com/display/TEAM/Parent/Child+Page") require.NoError(t, err) assert.Equal(t, "TEAM", ref.SpaceKey) // Sub-pages: the full path after space key is the title assert.Equal(t, "Parent/Child Page", ref.Title) }