244 lines
4.9 KiB
Go

package main
import (
"errors"
"reflect"
"github.com/aerogo/api"
"github.com/animenotifier/arn"
)
var routeTests = map[string][]string{
// User
"/user/:nick": []string{
"/+Akyoto",
},
"/user/:nick/threads": []string{
"/+Akyoto/threads",
},
"/user/:nick/posts": []string{
"/+Akyoto/posts",
},
"/user/:nick/tracks": []string{
"/+Akyoto/tracks",
},
"/user/:nick/animelist": []string{
"/+Akyoto/animelist",
},
"/user/:nick/animelist/anime/:id": []string{
"/+Akyoto/animelist/7929",
},
"/user/:nick/animelist/watching": []string{
"/+Akyoto/animelist/watching",
},
"/user/:nick/animelist/completed": []string{
"/+Akyoto/animelist/completed",
},
"/user/:nick/animelist/planned": []string{
"/+Akyoto/animelist/planned",
},
"/user/:nick/animelist/hold": []string{
"/+Akyoto/animelist/hold",
},
"/user/:nick/animelist/dropped": []string{
"/+Akyoto/animelist/dropped",
},
// Pages
"/anime/:id": []string{
"/anime/1",
},
"/thread/:id": []string{
"/thread/HJgS7c2K",
},
"/post/:id": []string{
"/post/B1RzshnK",
},
"/forum/:tag": []string{
"/forum/general",
},
"/search/:term": []string{
"/search/Dragon Ball",
},
"/tracks/:id": []string{
"/tracks/h0ac8sKkg",
},
// API
"/api/anime/:id": []string{
"/api/anime/1",
},
"/api/thread/:id": []string{
"/api/thread/HJgS7c2K",
},
"/api/post/:id": []string{
"/api/post/B1RzshnK",
},
"/api/animelist/:id": []string{
"/api/animelist/4J6qpK1ve",
},
"/api/animelist/:id/get/:item": []string{
"/api/animelist/4J6qpK1ve/get/7929",
},
"/api/animelist/:id/get/:item/:property": []string{
"/api/animelist/4J6qpK1ve/get/7929/Episodes",
},
"/api/settings/:id": []string{
"/api/settings/4J6qpK1ve",
},
"/api/user/:id": []string{
"/api/user/4J6qpK1ve",
},
"/api/emailtouser/:id": []string{
"/api/emailtouser/e.urbach@gmail.com",
},
"/api/googletouser/:id": []string{
"/api/googletouser/106530160120373282283",
},
"/api/facebooktouser/:id": []string{
"/api/facebooktouser/10207576239700188",
},
"/api/nicktouser/:id": []string{
"/api/nicktouser/Akyoto",
},
"/api/searchindex/:id": []string{
"/api/searchindex/Anime",
},
"/api/analytics/:id": []string{
"/api/analytics/4J6qpK1ve",
},
"/api/soundtrack/:id": []string{
"/api/soundtrack/h0ac8sKkg",
},
"/api/soundcloudtosoundtrack/:id": []string{
"/api/soundcloudtosoundtrack/145918628",
},
"/api/youtubetosoundtrack/:id": []string{
"/api/youtubetosoundtrack/hU2wqJuOIp4",
},
// Images
"/images/avatars/large/:file": []string{
"/images/avatars/large/4J6qpK1ve.webp",
},
"/images/avatars/small/:file": []string{
"/images/avatars/small/4J6qpK1ve.webp",
},
"/images/brand/:file": []string{
"/images/brand/64.webp",
},
"/images/login/:file": []string{
"/images/login/google",
},
"/images/cover/:file": []string{
"/images/cover/default",
},
"/images/elements/:file": []string{
"/images/elements/no-avatar.svg",
},
// Disable these tests because they require authorization
"/auth/google": nil,
"/auth/google/callback": nil,
"/auth/facebook": nil,
"/auth/facebook/callback": nil,
"/import": nil,
"/import/anilist/animelist": nil,
"/import/anilist/animelist/finish": nil,
"/import/myanimelist/animelist": nil,
"/import/myanimelist/animelist/finish": nil,
"/import/kitsu/animelist": nil,
"/import/kitsu/animelist/finish": nil,
"/anime/:id/edit": nil,
"/new/thread": nil,
"/new/soundtrack": nil,
"/editor": nil,
"/user": nil,
"/settings": nil,
"/extension/embed": nil,
}
// API interfaces
var creatable = reflect.TypeOf((*api.Creatable)(nil)).Elem()
var updatable = reflect.TypeOf((*api.Updatable)(nil)).Elem()
var actionable = reflect.TypeOf((*api.Actionable)(nil)).Elem()
var collection = reflect.TypeOf((*api.Collection)(nil)).Elem()
// Required interface implementations
var interfaceImplementations = map[string][]reflect.Type{
"User": []reflect.Type{
updatable,
},
"Thread": []reflect.Type{
creatable,
updatable,
actionable,
},
"Post": []reflect.Type{
creatable,
updatable,
actionable,
},
"SoundTrack": []reflect.Type{
creatable,
},
"Analytics": []reflect.Type{
creatable,
},
"AnimeList": []reflect.Type{
collection,
},
}
func init() {
// Specify test routes
for route, examples := range routeTests {
app.Test(route, examples)
}
// Check interface implementations
for typeName, interfaces := range interfaceImplementations {
for _, requiredInterface := range interfaces {
if !reflect.PtrTo(arn.DB.Type(typeName)).Implements(requiredInterface) {
panic(errors.New(typeName + " does not implement interface " + requiredInterface.Name()))
}
}
}
}