]> git.cworth.org Git - empires-server/commitdiff
test: Update the test suite to work with game creation
authorCarl Worth <cworth@cworth.org>
Sun, 31 May 2020 23:00:39 +0000 (16:00 -0700)
committerCarl Worth <cworth@cworth.org>
Sun, 31 May 2020 23:00:39 +0000 (16:00 -0700)
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

diff --git a/test b/test
index a75f515fbe4bfda34fa6dbb1b80d5fda4761442b..30dbe7f2781cd292de35b2b4112862f11af992c3 100755 (executable)
--- a/test
+++ b/test
-#!/bin/sh
-set -e
+#!/bin/bash
 
-ENDPOINT=http://localhost:3000
+usage ()
+{
+    echo "Usage:$0 <URL-to-test>"
+}
+
+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 <ENDPOINT> [data]
+curl_post()
+{
+    $CURL -X POST ${2:+-H 'Content-Type: application/json' -d "$2"} $URL/$1
+}
+
+# Get form a URL endpoint
+#
+# Usage:
+#
+# curl_get <ENDPOINT>
+curl_get()
+{
+    $CURL $URL/$1
+}
+
+# Create a new game of the specified engine type
+#
+# Usage:
+#
+# new_game <ENGINE>
+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