From d6817ef860a230cbbb694e729a400ed37ed43d68 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sun, 31 May 2020 16:00:39 -0700 Subject: [PATCH] test: Update the test suite to work with game creation Previously the test script only worked when given an API endpoint for a single game of Empires. In this commit we bring it up to something more modern by making it aware of the top-level APIs for creating a new game ID and then using that game ID to talk to the Empires API. We also revamp the test script so that it does some actual testing. Previously, it was just a simple script for exercising several endpoints. Now, it actually inspects responses and ensures that things are working correctly. --- test | 306 ++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 252 insertions(+), 54 deletions(-) diff --git a/test b/test index a75f515..30dbe7f 100755 --- a/test +++ b/test @@ -1,74 +1,272 @@ -#!/bin/sh -set -e +#!/bin/bash -ENDPOINT=http://localhost:3000 +usage () +{ + echo "Usage:$0 " +} + +if [ $# -lt 1 ]; then + echo "Error: No test URL given." >&2 + echo "" >&2 + usage >&2 + exit 1 +fi + +URL=$1 +CURL="curl --silent --show-error" + +_TEST_SECTION() +{ + echo "" + echo $1 + echo $1 | sed -e "s/./$2/g" +} + +TEST_SECTION() +{ + _TEST_SECTION "$1" = +} + +TEST_SUBSECTION() +{ + _TEST_SECTION "$1" - +} + +TEST() +{ + printf " $1" + printf "%*s" $(( 52 - ${#1} )) | tr ' ' '.' + (( tests_total++ )) || true +} + +# Result of test depends on the exit status of last command +TEST_END() +{ + if [ $? -eq 0 ]; then + echo -n "OK" + else + (( tests_failed++ )) || true + echo -n "FAIL" + fi + + # If we got an argument, append it after test result + if [ -n "$1" ]; then + echo " $1" + else + echo "" + fi +} + +# Print report of all previous test results +TEST_REPORT() +{ + echo "" + echo "Test Report" + echo "===========" + + if [ "$tests_failed" == "" ]; then + echo "All $tests_total tests passed." + echo "" + return 0 + else + echo "$tests_failed of $tests_total tests failed." + echo "" + return 1 + fi +} + +# Does a string contain a regular expression pattern +# +# Example: +# +# contains "All's well that ends well" "s.well" +contains() +{ + grep -q "$2" <<< $1 +} + +# Post to a URL endpoint with optional JSON data +# +# Usage: +# +# curl_post [data] +curl_post() +{ + $CURL -X POST ${2:+-H 'Content-Type: application/json' -d "$2"} $URL/$1 +} + +# Get form a URL endpoint +# +# Usage: +# +# curl_get +curl_get() +{ + $CURL $URL/$1 +} + +# Create a new game of the specified engine type +# +# Usage: +# +# new_game +new_game() +{ + curl_post new/$1 | jq -r . +} + +TEST_SECTION "LMNO (super-site for games)" -register() { - curl -X POST -H "Content-Type: application/json" -d "{\"name\": \"$1\", \"character\": \"$2\"}" $ENDPOINT/register +TEST_SUBSECTION "Testing home page" +home_page=$($CURL $URL) + +TEST "Contains 'Join Game'" +contains "$home_page" "Join Game" +TEST_END + +TEST "Contains 'Host a new game'" +contains "$home_page" "Host a new game" +TEST_END + +TEST_SUBSECTION "Creating some new games" + +TEST "Empires" +empires_game_id=$(new_game empires) +test "$empires_game_id" != "" +TEST_END $empires_game_id + +TEST "Tic Tac Toe" +tictactoe_game_id=$(new_game tictactoe) +test "$tictactoe_game_id" != "" +TEST_END $tictactoe_game_id + +TEST_SECTION "Empires game" + +empires_game_path=empires/$empires_game_id + +TEST_SUBSECTION "Empires game /register" + +empires_register() +{ + curl_post $empires_game_path/register "{\"name\": \"$1\", \"character\": \"$2\"}" +} + +empires_players_string() +{ + curl_get $empires_game_path/players | jq -r .[].name | tr '\n' ',' +} + +empires_characters_string() +{ + curl_get $empires_game_path/characters | jq -r .[] | tr '\n' ',' } -capture() { - curl -X POST $ENDPOINT/capture/$1/$2 +TEST "Registering a player returns an ID" +carl_id=$(empires_register Carl "Bugs Bunny" | jq -r .) +test "$carl_id" = "1" +TEST_END + +TEST "Registering several more players" +empires_register Richard "Bob Hope" > /dev/null +empires_register Kevin "Elvis Presley" > /dev/null +empires_register Stacy Phineas > /dev/null +empires_register David "Red Power Ranger" > /dev/null +empires_register Nancy "Audrey Hepburn" > /dev/null +bogus_id=$(empires_register Bogus "Mr. Bogus") +TEST_END + +TEST 'Verify complete players list (with "Bogus")' +players=$(empires_players_string) +test "$players" = "Carl,Richard,Kevin,Stacy,David,Nancy,Bogus," +TEST_END + +TEST 'Verify complete players list (with "Mr. Bogus")' +characters=$(empires_characters_string) +test "$characters" = "Bugs Bunny,Bob Hope,Elvis Presley,Phineas,Red Power Ranger,Audrey Hepburn,Mr. Bogus," +TEST_END + +TEST_SUBSECTION "Empires game /deregister" + +empires_deregister() +{ + curl_post $empires_game_path/deregister/$1 } -echo "Registering several players" -register Carl "Bugs Bunny" -register Richard "Bob Hope" -register Kevin "Elvis Presley" -register Stacy Phineas -register David Red Power Ranger -register Nancy "Audrey Hepburn" -register Bogus "Bogus Player" +TEST "Removing the bogus player" +empires_deregister $bogus_id +TEST_END -echo "Listing registered players (with bogus)" -curl $ENDPOINT/players -echo "" +TEST 'Verify modified players list (w/o "Bogus")"' +players=$(empires_players_string) +test "$players" = "Carl,Richard,Kevin,Stacy,David,Nancy," +TEST_END -echo "Listing characters (with bogus)" -curl $ENDPOINT/characters -echo "" +TEST 'Verify modified characters list (w/o "Mr. Bogus")' +characters=$(empires_characters_string) +test "$characters" = "Bugs Bunny,Bob Hope,Elvis Presley,Phineas,Red Power Ranger,Audrey Hepburn," +TEST_END -echo "Removing bogus player" -curl -X POST $ENDPOINT/deregister/7 -echo "" +TEST_SUBSECTION "Empires game /capture" -echo "Listing registered players (without bogus)" -curl $ENDPOINT/players -echo "" +empires_capture() +{ + curl_post $empires_game_path/capture/$1/$2 +} -echo "Listing characters (without bogus)" -curl $ENDPOINT/characters -echo "" +empires_empires_string() +{ + # Get empires as a compact string (much more compact than JSON) + curl_get $empires_game_path/empires | jq -c '.[] | [.id,.captures]' | tr '\n' ',' +} -echo "Performing some captures" -capture 1 2 -capture 3 5 -capture 4 6 -capture 3 4 +TEST "Verify empires before any captures" +empires=$(empires_empires_string) +test "$empires" = "[1,[]],[2,[]],[3,[]],[4,[]],[5,[]],[6,[]]," +TEST_END -echo "Listing captured empires" -curl $ENDPOINT/empires -echo "" +TEST "Perform some captures" +empires_capture 1 2 +empires_capture 3 5 +empires_capture 4 6 +empires_capture 3 4 +TEST_END -echo "Liberating player with index 2" -curl -X POST $ENDPOINT/liberate/2 -echo "" +TEST "Verify empires after captures" +empires=$(empires_empires_string) +test "$empires" = "[1,[2]],[2,[]],[3,[5,4]],[4,[6]],[5,[]],[6,[]]," +TEST_END -echo "Listing captured empires" -curl $ENDPOINT/empires -echo "" +TEST_SUBSECTION "Empires game /liberate" -echo "Clearing all captures" -curl -X POST $ENDPOINT/restart +empires_liberate() +{ + curl_post $empires_game_path/liberate/$1 +} + +TEST "Liberate a player" +empires_liberate 2 +TEST_END + +TEST "Verify empires after liberate" +empires=$(empires_empires_string) +test "$empires" = "[1,[]],[2,[]],[3,[5,4]],[4,[6]],[5,[]],[6,[]]," +TEST_END + +TEST_SUBSECTION "Empires game /reset" + +empires_reset() +{ + curl_post $empires_game_path/reset +} -echo "Listing cleared empires" -curl $ENDPOINT/empires -echo "" +TEST "Reset the game" +empires_reset +TEST_END -echo "Eliminating all players" -curl -X POST $ENDPOINT/reset +TEST "Verify players is now empty" +players=$(empires_players_string) +test "$players" = "" +TEST_END -echo "Listing empty players array" -curl $ENDPOINT/players -echo "" +TEST_REPORT -- 2.43.0