forked from mystiq/dex
334 lines
7.3 KiB
Go
334 lines
7.3 KiB
Go
|
package gendoc
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"io/ioutil"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/kylelemons/godebug/pretty"
|
||
|
)
|
||
|
|
||
|
func TestToSchema(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
s schema
|
||
|
want Schema
|
||
|
}{
|
||
|
{
|
||
|
s: schema{
|
||
|
ID: "UsersResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"users": {
|
||
|
Type: "array",
|
||
|
Items: &schema{
|
||
|
Ref: "User",
|
||
|
},
|
||
|
},
|
||
|
"nextPageToken": {Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
want: Schema{
|
||
|
Name: "UsersResponse",
|
||
|
Type: "object",
|
||
|
Children: []Schema{
|
||
|
{
|
||
|
Name: "nextPageToken",
|
||
|
Type: "string",
|
||
|
},
|
||
|
{
|
||
|
Name: "users",
|
||
|
Type: "array",
|
||
|
Children: []Schema{
|
||
|
{
|
||
|
Ref: "User",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
s: schema{
|
||
|
ID: "UserCreateResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"user": {
|
||
|
Type: "object",
|
||
|
Ref: "User",
|
||
|
},
|
||
|
"resetPasswordLink": {Type: "string"},
|
||
|
"emailSent": {Type: "boolean"},
|
||
|
},
|
||
|
},
|
||
|
want: Schema{
|
||
|
Name: "UserCreateResponse",
|
||
|
Type: "object",
|
||
|
Children: []Schema{
|
||
|
{
|
||
|
Name: "emailSent",
|
||
|
Type: "boolean",
|
||
|
},
|
||
|
{
|
||
|
Name: "resetPasswordLink",
|
||
|
Type: "string",
|
||
|
},
|
||
|
{
|
||
|
Name: "user",
|
||
|
Type: "object",
|
||
|
Ref: "User",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for i, tt := range tests {
|
||
|
got := tt.s.toSchema()
|
||
|
if diff := pretty.Compare(got, tt.want); diff != "" {
|
||
|
t.Errorf("case %d: got != want: %s", i, diff)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestUnmarsal(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
file string
|
||
|
want doc
|
||
|
}{
|
||
|
{
|
||
|
file: "testdata/admin.json",
|
||
|
want: doc{
|
||
|
Name: "adminschema",
|
||
|
Version: "v1",
|
||
|
Title: "Dex Admin API",
|
||
|
Description: "The Dex Admin API.",
|
||
|
DocumentationLink: "http://github.com/coreos/dex",
|
||
|
Protocol: "rest",
|
||
|
BasePath: "/api/v1/",
|
||
|
Schemas: map[string]schema{
|
||
|
"Admin": schema{
|
||
|
ID: "Admin",
|
||
|
Type: "object",
|
||
|
Description: "Admin represents an admin user within the database",
|
||
|
Properties: map[string]schema{
|
||
|
"id": {Type: "string"},
|
||
|
"email": {Type: "string"},
|
||
|
"password": {Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
"State": schema{
|
||
|
ID: "State",
|
||
|
Type: "object",
|
||
|
Description: "Admin represents dex data within.",
|
||
|
Properties: map[string]schema{
|
||
|
"AdminUserCreated": {Type: "boolean"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
Resources: map[string]methods{
|
||
|
"Admin": methods{
|
||
|
Methods: map[string]resource{
|
||
|
"Get": resource{
|
||
|
Description: "Retrieve information about an admin user.",
|
||
|
Method: "GET",
|
||
|
Path: "admin/{id}",
|
||
|
Parameters: map[string]param{
|
||
|
"id": param{
|
||
|
Type: "string",
|
||
|
Required: true,
|
||
|
Location: "path",
|
||
|
},
|
||
|
},
|
||
|
Response: &ref{"Admin"},
|
||
|
},
|
||
|
"Create": resource{
|
||
|
Description: "Create a new admin user.",
|
||
|
Method: "POST",
|
||
|
Path: "admin",
|
||
|
Request: &ref{"Admin"},
|
||
|
Response: &ref{"Admin"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"State": methods{
|
||
|
Methods: map[string]resource{
|
||
|
"Get": resource{
|
||
|
Description: "Get the state of the Dex DB",
|
||
|
Method: "GET",
|
||
|
Path: "state",
|
||
|
Response: &ref{"State"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, tt := range tests {
|
||
|
data, err := ioutil.ReadFile(tt.file)
|
||
|
if err != nil {
|
||
|
t.Errorf("case %q: read file failed %v", tt.file, err)
|
||
|
continue
|
||
|
}
|
||
|
var d doc
|
||
|
if err := json.Unmarshal(data, &d); err != nil {
|
||
|
t.Errorf("case %q: failed to unmarshal %v", tt.file, err)
|
||
|
continue
|
||
|
}
|
||
|
if diff := pretty.Compare(d, tt.want); diff != "" {
|
||
|
t.Errorf("case %q: got did not match want: %s", tt.file, diff)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestUnmarshalSchema(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
file string
|
||
|
want map[string]schema
|
||
|
}{
|
||
|
{
|
||
|
file: "testdata/worker.json",
|
||
|
want: map[string]schema{
|
||
|
"Error": schema{
|
||
|
ID: "Error",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"error": {Type: "string"},
|
||
|
"error_description": {Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
"Client": schema{
|
||
|
ID: "Client",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"id": {Type: "string"},
|
||
|
"redirectURIs": {
|
||
|
Type: "array",
|
||
|
Items: &schema{Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"ClientWithSecret": schema{
|
||
|
ID: "Client",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"id": {Type: "string"},
|
||
|
"secret": {Type: "string"},
|
||
|
"redirectURIs": {
|
||
|
Type: "array",
|
||
|
Items: &schema{Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"ClientPage": schema{
|
||
|
ID: "ClientPage",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"clients": {
|
||
|
Type: "array",
|
||
|
Items: &schema{
|
||
|
Ref: "Client",
|
||
|
},
|
||
|
},
|
||
|
"nextPageToken": {
|
||
|
Type: "string",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"User": schema{
|
||
|
ID: "User",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"id": {Type: "string"},
|
||
|
"email": {Type: "string"},
|
||
|
"displayName": {Type: "string"},
|
||
|
"emailVerified": {Type: "boolean"},
|
||
|
"admin": {Type: "boolean"},
|
||
|
"disabled": {Type: "boolean"},
|
||
|
"createdAt": {
|
||
|
Type: "string",
|
||
|
Format: "date-time",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"UserResponse": schema{
|
||
|
ID: "UserResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"user": {Ref: "User"},
|
||
|
},
|
||
|
},
|
||
|
"UsersResponse": schema{
|
||
|
ID: "UsersResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"users": {
|
||
|
Type: "array",
|
||
|
Items: &schema{
|
||
|
Ref: "User",
|
||
|
},
|
||
|
},
|
||
|
"nextPageToken": {Type: "string"},
|
||
|
},
|
||
|
},
|
||
|
"UserCreateRequest": schema{
|
||
|
ID: "UserCreateRequest",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"user": {
|
||
|
Ref: "User",
|
||
|
},
|
||
|
"redirectURL": {Type: "string", Format: "url"},
|
||
|
},
|
||
|
},
|
||
|
"UserCreateResponse": schema{
|
||
|
ID: "UserCreateResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"user": {
|
||
|
Type: "object",
|
||
|
Ref: "User",
|
||
|
},
|
||
|
"resetPasswordLink": {Type: "string"},
|
||
|
"emailSent": {Type: "boolean"},
|
||
|
},
|
||
|
},
|
||
|
"UserDisableRequest": schema{
|
||
|
ID: "UserDisableRequest",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"disable": {
|
||
|
Type: "boolean",
|
||
|
Description: "If true, disable this user, if false, enable them. No error is signaled if the user state doesn't change.",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
"UserDisableResponse": schema{
|
||
|
ID: "UserDisableResponse",
|
||
|
Type: "object",
|
||
|
Properties: map[string]schema{
|
||
|
"ok": {Type: "boolean"},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, tt := range tests {
|
||
|
data, err := ioutil.ReadFile(tt.file)
|
||
|
if err != nil {
|
||
|
t.Errorf("case %q: read file failed %v", tt.file, err)
|
||
|
continue
|
||
|
}
|
||
|
var d doc
|
||
|
if err := json.Unmarshal(data, &d); err != nil {
|
||
|
t.Errorf("case %q: failed to unmarshal %v", tt.file, err)
|
||
|
continue
|
||
|
}
|
||
|
if diff := pretty.Compare(d.Schemas, tt.want); diff != "" {
|
||
|
t.Errorf("case %q: got did not match want: %s", tt.file, diff)
|
||
|
}
|
||
|
}
|
||
|
}
|