diff --git a/app/Http/Controllers/BuildController.php b/app/Http/Controllers/BuildController.php index 77edc1586c..f969b9ed1c 100644 --- a/app/Http/Controllers/BuildController.php +++ b/app/Http/Controllers/BuildController.php @@ -67,6 +67,16 @@ public function tests(int $build_id): View ->with('filters', $filters); } + public function measurements(int $build_id): View + { + $this->setBuildById($build_id); + + $filters = json_decode(request()->get('filters')) ?? ['all' => []]; + + return $this->view('build.measurements', 'Build Measurements') + ->with('filters', $filters); + } + protected function renderBuildPage(int $build_id, string $page_name, string $page_title = '') { $this->setBuildById($build_id); diff --git a/database/migrations/2024_10_14_183851_buildmeasurements_unique_buildid_source_type_name.php b/database/migrations/2024_10_14_183851_buildmeasurements_unique_buildid_source_type_name.php new file mode 100644 index 0000000000..b0c834d830 --- /dev/null +++ b/database/migrations/2024_10_14_183851_buildmeasurements_unique_buildid_source_type_name.php @@ -0,0 +1,27 @@ +unique(['buildid', 'source', 'type', 'name']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('buildmeasurements', function (Blueprint $table) { + $table->dropUnique(['buildid', 'source', 'type', 'name']); + }); + } +}; diff --git a/resources/js/app.js b/resources/js/app.js index 350342e429..afc4254a0e 100755 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -31,6 +31,7 @@ import ViewDynamicAnalysis from './components/ViewDynamicAnalysis.vue'; import AllProjects from './components/AllProjects.vue'; import SubProjectDependencies from './components/SubProjectDependencies.vue'; import BuildTestsPage from './components/BuildTestsPage.vue'; +import BuildMeasurementsPage from './components/BuildMeasurementsPage.vue'; import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'; import * as FA from '@fortawesome/fontawesome-svg-core'; @@ -60,6 +61,7 @@ const cdash_components = { AllProjects, SubProjectDependencies, BuildTestsPage, + BuildMeasurementsPage, }; /** diff --git a/resources/js/components/BuildMeasurementsPage.vue b/resources/js/components/BuildMeasurementsPage.vue new file mode 100644 index 0000000000..b9ee139363 --- /dev/null +++ b/resources/js/components/BuildMeasurementsPage.vue @@ -0,0 +1,152 @@ + + + diff --git a/resources/views/build/measurements.blade.php b/resources/views/build/measurements.blade.php new file mode 100644 index 0000000000..26fa0c9d71 --- /dev/null +++ b/resources/views/build/measurements.blade.php @@ -0,0 +1,8 @@ +@extends('cdash', [ + 'vue' => true, + 'daisyui' => true, +]) + +@section('main_content') + +@endsection diff --git a/routes/web.php b/routes/web.php index 54338a13fa..05d0a17362 100755 --- a/routes/web.php +++ b/routes/web.php @@ -79,6 +79,8 @@ Route::get('/builds/{build_id}/tests', 'BuildController@tests'); +Route::get('/builds/{build_id}/measurements', 'BuildController@measurements'); + Route::get('/builds/{id}/update', 'BuildController@update'); Route::permanentRedirect('/build/{id}/update', url('/builds/{id}/update')); Route::get('/viewUpdate.php', function (Request $request) { diff --git a/tests/cypress/e2e/CMakeLists.txt b/tests/cypress/e2e/CMakeLists.txt index be818423fd..3a23c765d3 100644 --- a/tests/cypress/e2e/CMakeLists.txt +++ b/tests/cypress/e2e/CMakeLists.txt @@ -72,3 +72,6 @@ set_tests_properties(cypress/e2e/build-configure PROPERTIES DEPENDS cypress/e2e/ add_cypress_e2e_test(all-projects) set_tests_properties(cypress/e2e/all-projects PROPERTIES DEPENDS cypress/e2e/build-configure) + +add_cypress_e2e_test(build-measurements) +set_tests_properties(cypress/e2e/all-projects PROPERTIES DEPENDS cypress/e2e/all-project) diff --git a/tests/cypress/e2e/build-measurements.cy.js b/tests/cypress/e2e/build-measurements.cy.js new file mode 100644 index 0000000000..311055f200 --- /dev/null +++ b/tests/cypress/e2e/build-measurements.cy.js @@ -0,0 +1,15 @@ +/** + * TODO: Fill out this test once seed data for the build measurements functionality becomes available. + * For now, we just verify that the page loads with no errors. + */ +describe('Build measurements page', () => { + it('Loads page successfully', () => { + cy.visit('/builds/372/measurements'); + cy.get('#headername2').should('not.contain', '404 Not Found'); + }); + + it('Shows 404 if build does not exist', () => { + cy.visit('/builds/12345678/measurements'); + cy.get('#headername2').should('contain', '404 Not Found'); + }); +});