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)
}