2020-08-19 18:01:21 -06:00
package main
import (
2020-08-21 17:02:38 -06:00
"bytes"
"encoding/json"
"fmt"
"net/http/httptest"
"net/url"
2020-08-19 18:01:21 -06:00
"testing"
2020-08-21 17:02:38 -06:00
"time"
2020-09-15 15:58:21 -06:00
"github.com/spf13/afero"
2020-08-19 18:01:21 -06:00
)
2020-08-21 17:02:38 -06:00
const TestParticipantID = "shipox"
func ( hs * HTTPServer ) TestRequest ( path string , args map [ string ] string ) * httptest . ResponseRecorder {
vals := url . Values { }
vals . Set ( "pid" , TestParticipantID )
vals . Set ( "id" , TestTeamID )
2021-10-13 18:25:27 -06:00
for k , v := range args {
vals . Set ( k , v )
2020-08-21 17:02:38 -06:00
}
recorder := httptest . NewRecorder ( )
request := httptest . NewRequest (
"GET" ,
fmt . Sprintf ( "%s?%s" , path , vals . Encode ( ) ) ,
bytes . NewReader ( [ ] byte { } ) ,
)
hs . ServeHTTP ( recorder , request )
return recorder
}
2020-08-19 18:01:21 -06:00
func TestHttpd ( t * testing . T ) {
2020-08-21 17:02:38 -06:00
hs := NewHTTPServer ( "/" , NewTestServer ( ) )
if r := hs . TestRequest ( "/" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/index.html" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/rolodex.html" , nil ) ; r . Result ( ) . StatusCode != 404 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/state" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
2020-10-14 10:05:53 -06:00
} else if r . Body . String ( ) != ` { "Config": { "Devel":false},"Messages":"messages.html","TeamNames": { },"PointsLog":[],"Puzzles": { }} ` {
2020-10-13 16:41:50 -06:00
t . Error ( "Unexpected state" , r . Body . String ( ) )
2020-08-21 17:02:38 -06:00
}
if r := hs . TestRequest ( "/register" , map [ string ] string { "id" : "bad team id" , "name" : "GoTeam" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
2021-10-13 18:25:27 -06:00
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"not registered","description":"team ID not found in list of valid team IDs"}} ` {
2020-08-21 17:02:38 -06:00
t . Error ( "Register bad team ID failed" )
}
if r := hs . TestRequest ( "/register" , map [ string ] string { "name" : "GoTeam" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
2021-10-13 18:25:27 -06:00
} else if r . Body . String ( ) != ` { "status":"success","data": { "short":"registered","description":"team ID registered"}} ` {
2020-08-21 17:02:38 -06:00
t . Error ( "Register failed" )
}
2020-10-13 19:48:37 -06:00
if r := hs . TestRequest ( "/register" , map [ string ] string { "name" : "GoTeam" } ) ; r . Result ( ) . StatusCode != 200 {
2020-10-13 18:33:12 -06:00
t . Error ( r . Result ( ) )
2021-10-13 18:25:27 -06:00
} else if r . Body . String ( ) != ` { "status":"success","data": { "short":"already registered","description":"team ID has already been registered"}} ` {
2020-10-13 18:33:12 -06:00
t . Error ( "Register failed" , r . Body . String ( ) )
}
2022-01-28 16:26:27 -07:00
// Test participant assignment
if r := hs . TestRequest ( "/assign" , map [ string ] string { "pid" : "badParticipantID" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"unable to associate participant and team","description":"participant ID not found in list of valid participant IDs"}} ` {
t . Error ( "Assignment failed" , r . Body . String ( ) )
}
if r := hs . TestRequest ( "/assign" , map [ string ] string { "id" : "bad team id" , "pid" : "participantID" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"unable to associate participant and team","description":"Provided team does not exist, or is not registered"}} ` {
t . Error ( "Assignment failed" , r . Body . String ( ) )
}
if r := hs . TestRequest ( "/assign" , map [ string ] string { "id" : "teamID" , "pid" : "participantID" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "status":"success","data": { "short":"assigned","description":"participant and team have been associated"}} ` {
t . Error ( "Assignment failed" , r . Body . String ( ) )
}
2020-10-13 18:33:12 -06:00
2021-10-26 12:48:23 -06:00
time . Sleep ( TestMaintenanceInterval )
2020-08-21 17:02:38 -06:00
if r := hs . TestRequest ( "/state" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "Config": { "Devel":false},"Messages":"messages.html","TeamNames": { "self":"GoTeam"},"PointsLog":[],"Puzzles": { "pategory":[1]}} ` {
t . Error ( "Unexpected state" , r . Body . String ( ) )
}
if r := hs . TestRequest ( "/content/pategory" , nil ) ; r . Result ( ) . StatusCode != 404 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/content/pategory/1/not-here" , nil ) ; r . Result ( ) . StatusCode != 404 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/content/pategory/2/moo.txt" , nil ) ; r . Result ( ) . StatusCode != 404 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/content/pategory/1/" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
}
if r := hs . TestRequest ( "/content/pategory/1/moo.txt" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` moo ` {
t . Error ( "Unexpected body" , r . Body . String ( ) )
}
2022-01-28 16:26:27 -07:00
if r := hs . TestRequest ( "/answer" , map [ string ] string { "cat" : "pategory" , "points" : "1" , "answer" : "answer123" , "pid" : "bad participant ID" } ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"not accepted","description":"invalid participant ID"}} ` {
t . Error ( "Unexpected body" , r . Body . String ( ) )
}
if r := hs . TestRequest ( "/answer" , map [ string ] string { "cat" : "pategory" , "points" : "1" , "answer" : "moo" , "pid" : "participantID" } ) ; r . Result ( ) . StatusCode != 200 {
2020-08-21 17:02:38 -06:00
t . Error ( r . Result ( ) )
2021-10-13 18:25:27 -06:00
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"not accepted","description":"incorrect answer"}} ` {
2020-08-21 17:02:38 -06:00
t . Error ( "Unexpected body" , r . Body . String ( ) )
}
2022-01-28 16:26:27 -07:00
if r := hs . TestRequest ( "/answer" , map [ string ] string { "cat" : "pategory" , "points" : "1" , "answer" : "answer123" , "pid" : "participantID" } ) ; r . Result ( ) . StatusCode != 200 {
2020-08-21 17:02:38 -06:00
t . Error ( r . Result ( ) )
} else if r . Body . String ( ) != ` { "status":"success","data": { "short":"accepted","description":"1 points awarded in pategory"}} ` {
t . Error ( "Unexpected body" , r . Body . String ( ) )
}
time . Sleep ( TestMaintenanceInterval )
2020-10-13 18:33:12 -06:00
if r := hs . TestRequest ( "/content/pategory/2/puzzle.json" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
}
2020-08-21 17:02:38 -06:00
state := StateExport { }
if r := hs . TestRequest ( "/state" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Error ( r . Result ( ) )
} else if err := json . Unmarshal ( r . Body . Bytes ( ) , & state ) ; err != nil {
t . Error ( err )
} else if len ( state . PointsLog ) != 1 {
t . Error ( "Points log wrong length" )
} else if len ( state . Puzzles [ "pategory" ] ) != 2 {
t . Error ( "Didn't unlock next puzzle" )
}
2022-01-28 16:26:27 -07:00
if r := hs . TestRequest ( "/answer" , map [ string ] string { "cat" : "pategory" , "points" : "1" , "answer" : "answer123" , "pid" : "participantID" } ) ; r . Result ( ) . StatusCode != 200 {
2020-08-21 17:02:38 -06:00
t . Error ( r . Result ( ) )
2021-10-13 18:25:27 -06:00
} else if r . Body . String ( ) != ` { "status":"fail","data": { "short":"not accepted","description":"error awarding points: points already awarded to this team in this category"}} ` {
2020-08-21 17:02:38 -06:00
t . Error ( "Unexpected body" , r . Body . String ( ) )
}
2020-08-19 18:01:21 -06:00
}
2020-09-15 15:58:21 -06:00
func TestDevelMemHttpd ( t * testing . T ) {
srv := NewTestServer ( )
{
hs := NewHTTPServer ( "/" , srv )
if r := hs . TestRequest ( "/mothballer/pategory.md" , nil ) ; r . Result ( ) . StatusCode != 404 {
t . Error ( "Should have gotten a 404 for mothballer in prod mode" )
}
}
{
srv . Config . Devel = true
hs := NewHTTPServer ( "/" , srv )
if r := hs . TestRequest ( "/mothballer/pategory.md" , nil ) ; r . Result ( ) . StatusCode != 500 {
t . Log ( r . Body . String ( ) )
t . Log ( r . Result ( ) )
t . Error ( "Should have given us an internal server error, since category is a mothball" )
}
}
}
func TestDevelFsHttps ( t * testing . T ) {
fs := afero . NewBasePathFs ( afero . NewOsFs ( ) , "testdata" )
transpilerProvider := NewTranspilerProvider ( fs )
srv := NewMothServer ( Configuration { Devel : true } , NewTestTheme ( ) , NewTestState ( ) , transpilerProvider )
hs := NewHTTPServer ( "/" , srv )
if r := hs . TestRequest ( "/mothballer/cat0.mb" , nil ) ; r . Result ( ) . StatusCode != 200 {
t . Log ( r . Body . String ( ) )
t . Log ( r . Result ( ) )
t . Error ( "Didn't get a Mothball" )
}
}