mirror of https://github.com/dexidp/dex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
333 lines
7.3 KiB
333 lines
7.3 KiB
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) |
|
} |
|
} |
|
}
|
|
|