IndieAuth #25
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"encoding/json"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
owl "h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
|
|
|
@ -3,7 +3,7 @@ package web_test
|
|||
import (
|
||||
"h4kor/owl-blogs"
|
||||
main "h4kor/owl-blogs/cmd/owl/web"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
|
|
57
owl_test.go
57
owl_test.go
|
@ -2,67 +2,10 @@ package owl_test
|
|||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
)
|
||||
|
||||
type MockHtmlParser struct{}
|
||||
|
||||
func (*MockHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) {
|
||||
return owl.ParsedHEntry{Title: "Mock Title"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) ParseLinks(resp *http.Response) ([]string, error) {
|
||||
return []string{"http://example.com"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) ParseLinksFromString(string) ([]string, error) {
|
||||
return []string{"http://example.com"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) {
|
||||
return "http://example.com/webmention", nil
|
||||
|
||||
}
|
||||
|
||||
type MockParseLinksHtmlParser struct {
|
||||
Links []string
|
||||
}
|
||||
|
||||
func (*MockParseLinksHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) {
|
||||
return owl.ParsedHEntry{Title: "Mock Title"}, nil
|
||||
|
||||
}
|
||||
func (parser *MockParseLinksHtmlParser) ParseLinks(resp *http.Response) ([]string, error) {
|
||||
return parser.Links, nil
|
||||
|
||||
}
|
||||
func (parser *MockParseLinksHtmlParser) ParseLinksFromString(string) ([]string, error) {
|
||||
return parser.Links, nil
|
||||
|
||||
}
|
||||
func (*MockParseLinksHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) {
|
||||
return "http://example.com/webmention", nil
|
||||
|
||||
}
|
||||
|
||||
type MockHttpClient struct{}
|
||||
|
||||
func (*MockHttpClient) Get(url string) (resp *http.Response, err error) {
|
||||
return &http.Response{}, nil
|
||||
}
|
||||
func (*MockHttpClient) Post(url, contentType string, body io.Reader) (resp *http.Response, err error) {
|
||||
|
||||
return &http.Response{}, nil
|
||||
}
|
||||
func (*MockHttpClient) PostForm(url string, data url.Values) (resp *http.Response, err error) {
|
||||
|
||||
return &http.Response{}, nil
|
||||
}
|
||||
|
||||
func randomName() string {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
var letters = []rune("abcdefghijklmnopqrstuvwxyz")
|
||||
|
|
41
post_test.go
41
post_test.go
|
@ -2,7 +2,8 @@ package owl_test
|
|||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"h4kor/owl-blogs/test/mocks"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
|
@ -146,8 +147,8 @@ func TestPersistIncomingWebmention(t *testing.T) {
|
|||
|
||||
func TestAddIncomingWebmentionCreatesFile(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -160,8 +161,8 @@ func TestAddIncomingWebmentionCreatesFile(t *testing.T) {
|
|||
|
||||
func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -180,8 +181,8 @@ func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) {
|
|||
|
||||
func TestEnrichAddsTitle(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -294,8 +295,8 @@ func TestScanningForLinksDoesAddReplyUrl(t *testing.T) {
|
|||
|
||||
func TestCanSendWebmention(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -315,8 +316,8 @@ func TestCanSendWebmention(t *testing.T) {
|
|||
|
||||
func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -340,8 +341,8 @@ func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) {
|
|||
|
||||
func TestSendingMultipleWebmentions(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -367,8 +368,8 @@ func TestSendingMultipleWebmentions(t *testing.T) {
|
|||
|
||||
func TestReceivingMultipleWebmentions(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -392,8 +393,8 @@ func TestReceivingMultipleWebmentions(t *testing.T) {
|
|||
|
||||
func TestSendingAndReceivingMultipleWebmentions(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockHtmlParser{}
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockHtmlParser{}
|
||||
user, _ := repo.CreateUser("testuser")
|
||||
post, _ := user.CreateNewPost("testpost", false)
|
||||
|
||||
|
@ -425,8 +426,8 @@ func TestSendingAndReceivingMultipleWebmentions(t *testing.T) {
|
|||
|
||||
func TestComplexParallelWebmentions(t *testing.T) {
|
||||
repo := getTestRepo(owl.RepoConfig{})
|
||||
repo.HttpClient = &MockHttpClient{}
|
||||
repo.Parser = &MockParseLinksHtmlParser{
|
||||
repo.HttpClient = &mocks.MockHttpClient{}
|
||||
repo.Parser = &mocks.MockParseLinksHtmlParser{
|
||||
Links: []string{
|
||||
"http://example.com/1",
|
||||
"http://example.com/2",
|
||||
|
@ -469,7 +470,7 @@ func TestComplexParallelWebmentions(t *testing.T) {
|
|||
// func TestComplexParallelSimulatedProcessesWebmentions(t *testing.T) {
|
||||
// repoName := testRepoName()
|
||||
// repo, _ := owl.CreateRepository(repoName, owl.RepoConfig{})
|
||||
// repo.HttpClient = &MockHttpClient{}
|
||||
// repo.HttpClient = &mocks.MockHttpClient{}
|
||||
// repo.Parser = &MockParseLinksHtmlParser{
|
||||
// Links: []string{
|
||||
// "http://example.com/1",
|
||||
|
|
|
@ -2,7 +2,7 @@ package owl_test
|
|||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
|
|
@ -2,7 +2,7 @@ package owl_test
|
|||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
|
|
@ -2,7 +2,7 @@ package owl_test
|
|||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
package mocks
|
||||
|
||||
import (
|
||||
"h4kor/owl-blogs"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
type MockHtmlParser struct{}
|
||||
|
||||
func (*MockHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) {
|
||||
return owl.ParsedHEntry{Title: "Mock Title"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) ParseLinks(resp *http.Response) ([]string, error) {
|
||||
return []string{"http://example.com"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) ParseLinksFromString(string) ([]string, error) {
|
||||
return []string{"http://example.com"}, nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) {
|
||||
return "http://example.com/webmention", nil
|
||||
|
||||
}
|
||||
func (*MockHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) {
|
||||
return []string{"http://example.com/redirect"}, nil
|
||||
}
|
||||
|
||||
type MockParseLinksHtmlParser struct {
|
||||
Links []string
|
||||
}
|
||||
|
||||
func (*MockParseLinksHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) {
|
||||
return owl.ParsedHEntry{Title: "Mock Title"}, nil
|
||||
}
|
||||
func (parser *MockParseLinksHtmlParser) ParseLinks(resp *http.Response) ([]string, error) {
|
||||
return parser.Links, nil
|
||||
}
|
||||
func (parser *MockParseLinksHtmlParser) ParseLinksFromString(string) ([]string, error) {
|
||||
return parser.Links, nil
|
||||
}
|
||||
func (*MockParseLinksHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) {
|
||||
return "http://example.com/webmention", nil
|
||||
}
|
||||
func (parser *MockParseLinksHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) {
|
||||
return parser.Links, nil
|
||||
}
|
||||
|
||||
type MockHttpClient struct{}
|
||||
|
||||
func (*MockHttpClient) Get(url string) (resp *http.Response, err error) {
|
||||
return &http.Response{}, nil
|
||||
}
|
||||
func (*MockHttpClient) Post(url, contentType string, body io.Reader) (resp *http.Response, err error) {
|
||||
|
||||
return &http.Response{}, nil
|
||||
}
|
||||
func (*MockHttpClient) PostForm(url string, data url.Values) (resp *http.Response, err error) {
|
||||
|
||||
return &http.Response{}, nil
|
||||
}
|
|
@ -3,7 +3,7 @@ package owl_test
|
|||
import (
|
||||
"fmt"
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
|
|
@ -61,6 +61,7 @@ type HtmlParser interface {
|
|||
ParseLinks(resp *http.Response) ([]string, error)
|
||||
ParseLinksFromString(string) ([]string, error)
|
||||
GetWebmentionEndpoint(resp *http.Response) (string, error)
|
||||
GetRedirctUris(resp *http.Response) ([]string, error)
|
||||
}
|
||||
|
||||
type OwlHttpClient = http.Client
|
||||
|
@ -243,3 +244,48 @@ func (OwlHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error)
|
|||
}
|
||||
return requestUrl.ResolveReference(linkUrl).String(), nil
|
||||
}
|
||||
|
||||
func (OwlHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) {
|
||||
//request url
|
||||
requestUrl := resp.Request.URL
|
||||
|
||||
htmlStr, err := readResponseBody(resp)
|
||||
if err != nil {
|
||||
return make([]string, 0), err
|
||||
}
|
||||
doc, err := html.Parse(strings.NewReader(htmlStr))
|
||||
if err != nil {
|
||||
return make([]string, 0), err
|
||||
}
|
||||
|
||||
var findLinks func(*html.Node) ([]string, error)
|
||||
findLinks = func(n *html.Node) ([]string, error) {
|
||||
links := make([]string, 0)
|
||||
if n.Type == html.ElementNode && n.Data == "link" {
|
||||
// check for rel="redirect_uri"
|
||||
rel := ""
|
||||
href := ""
|
||||
|
||||
for _, attr := range n.Attr {
|
||||
if attr.Key == "href" {
|
||||
href = attr.Val
|
||||
}
|
||||
if attr.Key == "rel" {
|
||||
rel = attr.Val
|
||||
}
|
||||
}
|
||||
if rel == "redirect_uri" {
|
||||
linkUrl, err := url.Parse(href)
|
||||
if err == nil {
|
||||
links = append(links, requestUrl.ResolveReference(linkUrl).String())
|
||||
}
|
||||
}
|
||||
}
|
||||
for c := n.FirstChild; c != nil; c = c.NextSibling {
|
||||
childLinks, _ := findLinks(c)
|
||||
links = append(links, childLinks...)
|
||||
}
|
||||
return links, nil
|
||||
}
|
||||
return findLinks(doc)
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ package owl_test
|
|||
import (
|
||||
"bytes"
|
||||
"h4kor/owl-blogs"
|
||||
"h4kor/owl-blogs/priv/assertions"
|
||||
"h4kor/owl-blogs/test/assertions"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
|
Loading…
Reference in New Issue