- classes.OAuthProvider and classes.OAuthProviderSource; GET /oauth-providers looks the source up per request and keeps the empty body without one - exported RegistrationSettings, RegistrationsFromIP, RefreshTTL, RemoteIP - RegisterOptions.PasswordLess (has_self_set_password=false) and FinishLogin (restore + reactivate mail, last_ip_address, last_seen; no event) - TestOAuthProvidersSourceSmoke, TestSocialHooksSmoke; README
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.golem15.com/golem15/sm-user-plugin/classes"
|
|
"git.golem15.com/golem15/sm-user-plugin/controllers"
|
|
"git.golem15.com/golem15/summercms/modules/backpack"
|
|
)
|
|
|
|
// fakeProviderSource is a social-login plugin's provider source.
|
|
type fakeProviderSource struct {
|
|
enabled []classes.OAuthProvider
|
|
known []string
|
|
}
|
|
|
|
func (f fakeProviderSource) EnabledOAuthProviders(context.Context) []classes.OAuthProvider {
|
|
return f.enabled
|
|
}
|
|
|
|
func (f fakeProviderSource) KnownOAuthProviders() []string { return f.known }
|
|
|
|
// TestOAuthProvidersSourceSmoke checks that oauth-providers keeps the empty
|
|
// body without a published source and lists the source's enabled providers,
|
|
// looked up per request, once one is published.
|
|
func TestOAuthProvidersSourceSmoke(t *testing.T) {
|
|
app := backpack.New(sessionConfig(t))
|
|
h := controllers.OAuthProviders(app)
|
|
get := func() *httptest.ResponseRecorder {
|
|
req := httptest.NewRequest(http.MethodGet, "/_user/api/v1/oauth-providers", nil)
|
|
rec := httptest.NewRecorder()
|
|
h(rec, req)
|
|
return rec
|
|
}
|
|
|
|
empty := get()
|
|
if empty.Code != http.StatusOK {
|
|
t.Fatalf("status without a source = %d", empty.Code)
|
|
}
|
|
// The bytes the handler answered before sources existed (wire encodes
|
|
// map keys sorted; the PHP recording has the same JSON value).
|
|
if got := strings.TrimRight(empty.Body.String(), "\n"); got != `{"providers":[],"success":true}` {
|
|
t.Fatalf("body without a source = %s", got)
|
|
}
|
|
|
|
src := fakeProviderSource{
|
|
enabled: []classes.OAuthProvider{{Name: "google", Label: "Google"}},
|
|
known: []string{"google", "facebook"},
|
|
}
|
|
if err := app.Publish[classes.OAuthProviderSource](src); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rec := get()
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("status with a source = %d", rec.Code)
|
|
}
|
|
if cc := rec.Header().Get("Cache-Control"); cc != "no-cache, private" {
|
|
t.Fatalf("Cache-Control = %q", cc)
|
|
}
|
|
var body struct {
|
|
Success bool `json:"success"`
|
|
Providers []classes.OAuthProvider `json:"providers"`
|
|
}
|
|
if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil {
|
|
t.Fatalf("decode %s: %v", rec.Body.String(), err)
|
|
}
|
|
if !body.Success || !reflect.DeepEqual(body.Providers, src.enabled) {
|
|
t.Fatalf("body with a source = %s", rec.Body.String())
|
|
}
|
|
}
|