From ca62be49b63c5a961efc49cde86ec937e2a45968 Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Fri, 25 Nov 2022 19:39:51 -0500 Subject: [PATCH] Added Test class to track benchmark groups --- .../20221125213226_add_results_table.php | 2 +- .../20221125223430_add_tests_table.php | 33 ++++++++++++ src/Controllers/ResultController.php | 8 ++- src/Controllers/TestController.php | 53 +++++++++++++++++++ src/Models/Result.php | 5 ++ src/Models/Test.php | 18 +++++++ src/routes.php | 5 ++ views/layout/navbar.twig | 1 + views/result/add.twig | 12 ++++- views/test/add.twig | 35 ++++++++++++ views/test/list.twig | 28 ++++++++++ views/test/view.twig | 49 +++++++++++++++++ 12 files changed, 245 insertions(+), 4 deletions(-) create mode 100644 db/migrations/20221125223430_add_tests_table.php create mode 100644 src/Controllers/TestController.php create mode 100644 src/Models/Test.php create mode 100644 views/test/add.twig create mode 100644 views/test/list.twig create mode 100644 views/test/view.twig diff --git a/db/migrations/20221125213226_add_results_table.php b/db/migrations/20221125213226_add_results_table.php index d4e64bf..a65aa9f 100644 --- a/db/migrations/20221125213226_add_results_table.php +++ b/db/migrations/20221125213226_add_results_table.php @@ -20,7 +20,7 @@ final class AddResultsTable extends AbstractMigration { $table = $this->table('results'); $table->addColumn('component', 'string', ['null' => false]) - ->addColumn('benchmark', 'text', ['null' => false]) + ->addColumn('benchmark', 'string', ['null' => false]) ->addColumn('type', 'string', ['null' => false, 'default' => 'fps']) ->addColumn('average', 'integer', ['null' => false]) ->addColumn('minimum', 'integer') diff --git a/db/migrations/20221125223430_add_tests_table.php b/db/migrations/20221125223430_add_tests_table.php new file mode 100644 index 0000000..08204ba --- /dev/null +++ b/db/migrations/20221125223430_add_tests_table.php @@ -0,0 +1,33 @@ +table('tests'); + $table->addColumn('name', 'string', ['null' => false]) + ->addColumn('description', 'text', ['null' => false]) + ->addTimestamps() + ->addIndex(['name']) + ->create(); + + $results = $this->table('results'); + $results->addColumn('test_id', 'integer', ['null' => false]) + ->addForeignKey('test_id', 'tests', 'id', ['delete'=> 'CASCADE', 'update'=> 'CASCADE']) + ->update(); + } +} diff --git a/src/Controllers/ResultController.php b/src/Controllers/ResultController.php index 0bc7c1e..44c35f0 100644 --- a/src/Controllers/ResultController.php +++ b/src/Controllers/ResultController.php @@ -7,6 +7,7 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Routing\RouteContext; use Slim\Views\Twig; use BitGoblin\Colossus\Models\Result; +use BitGoblin\Colossus\Models\Test; class ResultController extends Controller { @@ -20,14 +21,19 @@ class ResultController extends Controller { } public function getAdd(Request $request, Response $response): Response { + $tests = Test::all(); + $view = Twig::fromRequest($request); - return $view->render($response, 'result/add.twig'); + return $view->render($response, 'result/add.twig', [ + 'tests' => $tests, + ]); } public function postAdd(Request $request, Response $response): Response { $params = (array)$request->getParsedBody(); $result = new Result; + $result->test_id = $params['result_test']; $result->component = $params['result_component']; $result->benchmark = $params['result_benchmark']; $result->type = $params['result_type']; diff --git a/src/Controllers/TestController.php b/src/Controllers/TestController.php new file mode 100644 index 0000000..cb0ea14 --- /dev/null +++ b/src/Controllers/TestController.php @@ -0,0 +1,53 @@ +render($response, 'test/list.twig', [ + 'tests' => $tests, + ]); + } + + public function getView(Request $request, Response $response, array $args): Response { + $test = Test::where('id', $args['test_id'])->first(); + + $view = Twig::fromRequest($request); + return $view->render($response, 'test/view.twig', [ + 'test' => $test, + ]); + } + + public function getAdd(Request $request, Response $response): Response { + $view = Twig::fromRequest($request); + return $view->render($response, 'test/add.twig'); + } + + public function postAdd(Request $request, Response $response): Response { + $params = (array)$request->getParsedBody(); + + $test = new Test; + $test->name = $params['test_name']; + $test->description = $params['test_description']; + + $test->save(); + + // redirect the user back to the home page + $routeContext = RouteContext::fromRequest($request); + $routeParser = $routeContext->getRouteParser(); + return $response + ->withHeader('Location', $routeParser->urlFor('test.list')) + ->withStatus(302); + } + +} diff --git a/src/Models/Result.php b/src/Models/Result.php index 6bfe2a6..57a4535 100644 --- a/src/Models/Result.php +++ b/src/Models/Result.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; class Result extends Model { protected $fillable = [ + 'test_id', 'component', 'benchmark', 'type', @@ -15,4 +16,8 @@ class Result extends Model { 'maximum', ]; + public function test() { + return $this->belongsTo(Test::class); + } + } \ No newline at end of file diff --git a/src/Models/Test.php b/src/Models/Test.php new file mode 100644 index 0000000..25772b5 --- /dev/null +++ b/src/Models/Test.php @@ -0,0 +1,18 @@ +hasMany(Result::class); + } + +} \ No newline at end of file diff --git a/src/routes.php b/src/routes.php index a34e14f..d238d36 100644 --- a/src/routes.php +++ b/src/routes.php @@ -2,6 +2,11 @@ $app->get('/', '\\BitGoblin\\Colossus\\Controllers\\HomeController:getIndex')->setName('dashboard'); +$app->get('/test', '\\BitGoblin\\Colossus\\Controllers\\TestController:getList')->setName('test.list'); +$app->get('/test/add', '\\BitGoblin\\Colossus\\Controllers\\TestController:getAdd')->setName('test.add'); +$app->post('/test/add', '\\BitGoblin\\Colossus\\Controllers\\TestController:postAdd'); +$app->get('/test/{test_id}', '\\BitGoblin\\Colossus\\Controllers\\TestController:getView')->setName('test.view'); + $app->get('/result', '\\BitGoblin\\Colossus\\Controllers\\ResultController:getList')->setName('result.list'); $app->get('/result/add', '\\BitGoblin\\Colossus\\Controllers\\ResultController:getAdd')->setName('result.add'); $app->post('/result/add', '\\BitGoblin\\Colossus\\Controllers\\ResultController:postAdd'); diff --git a/views/layout/navbar.twig b/views/layout/navbar.twig index da3c9d7..ece3a27 100644 --- a/views/layout/navbar.twig +++ b/views/layout/navbar.twig @@ -3,6 +3,7 @@ diff --git a/views/result/add.twig b/views/result/add.twig index d7b9b30..2039679 100644 --- a/views/result/add.twig +++ b/views/result/add.twig @@ -14,11 +14,19 @@
-
+
+ + +
+
-
+
diff --git a/views/test/add.twig b/views/test/add.twig new file mode 100644 index 0000000..39bf856 --- /dev/null +++ b/views/test/add.twig @@ -0,0 +1,35 @@ +{% extends 'layout.twig' %} + +{% block title %}Add New Test{% endblock %} + +{% block content %} + +
+
+

Add new test

+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + + +
+
+ +{% endblock %} diff --git a/views/test/list.twig b/views/test/list.twig new file mode 100644 index 0000000..668b0d8 --- /dev/null +++ b/views/test/list.twig @@ -0,0 +1,28 @@ +{% extends 'layout.twig' %} + +{% block title %}List of Tests{% endblock %} + +{% block content %} +

Tests list...

+ + {% if tests | length > 0 %} + + + + + + + + + {% for t in tests %} + + + + + {% endfor %} + +
Test nameDescription
{{ t.name }}{{ t.description | slice(0, 100) }}
+ {% else %} +

There are no tests in the database - perhaps you should create one?

+ {% endif %} +{% endblock %} diff --git a/views/test/view.twig b/views/test/view.twig new file mode 100644 index 0000000..31517e5 --- /dev/null +++ b/views/test/view.twig @@ -0,0 +1,49 @@ +{% extends 'layout.twig' %} + +{% block title %}Test: {{ test.name }}{% endblock %} + +{% block content %} +
+
+

{{ test.name }}

+

{{ test.description }}

+
+
+ +
+ +
+
+

Test results:

+ + {% if test.results | length > 0 %} + + + + + + + + + + + + + {% for r in test.results %} + + + + + + + + + {% endfor %} + +
ComponentBenchmarkScoringAvg.Min.Max.
{{ r.component }}{{ r.benchmark }}{{ r.type | capitalize }}{{ r.average }}{{ r.minimum ? r.minimum : 'N/a' }}{{ r.maximum ? r.maximum : 'N/a' }}
+ {% else %} +

There are no results associated with this.

+ {% endif %} +
+
+{% endblock %}