// SPDX-FileCopyrightText: 2021 Harald Eilertsen // // SPDX-License-Identifier: AGPL-3.0-or-later class ConcertsTableTest extends WP_UnitTestCase { const VENUES = [ [ "Rockefeller Music Hall", "Oslo" ], [ "Sentrum Scene", "Oslo" ], [ "Revolver", "Oslo" ], [ "Meieriet", "Sogndal" ], ]; const CONCERTS = [ [ "Concert at Rockefeller #", 0, 2 ], [ "Concert at Sentrum Scene #", 1, 4 ], [ "Concert at Revolver #", 2, 5 ], [ "Concert at Meieriet #", 3, 5 ], ]; private static $concerts = []; /* This function runs _once_ before all the test cases. * * Use it to set up a common state that all test cases can * use */ static function wpSetUpBeforeClass() : void { $created_venues = []; foreach (self::VENUES as $venue) { $created_venues[] = GiglogAdmin_Venue::find_or_create($venue[0], $venue[1]); } $today = new DateTime(); foreach (self::CONCERTS as $concert) { for ($i = 0; $i < $concert[2]; $i++) { if ($concert[2] > 1) { $concert_name = $concert[0] . ($i + 1); } else { $concert_name = $concert[0]; } $offset = rand(1, 13); $concert_date = $today->modify( "+$offset days" ); self::$concerts[] = GiglogAdmin_Concert::create( $concert_name, $created_venues[$concert[1]]->id(), $concert_date->format( 'Y-m-d' ), "https://example.com/tickets/42", "https://example.com/events/93"); } } } /* This function runs _once_ after all the test cases in this class. * * It is needed to clean up changes in the database that we don't want * to disturb any other tests. */ static function wpTearDownAfterClass() : void { global $wpdb; $tables = [ "{$wpdb->prefix}giglogadmin_concerts", "{$wpdb->prefix}giglogadmin_venues", ]; foreach( $tables as $table ) { $wpdb->query("DELETE FROM {$table}"); } } function testShowAllControlsToAdminOnAdminPage() { global $current_screen; global $current_user; $current_user = $this->factory()->user->create_and_get(['role' => 'administrator']); $oldscreen = $current_screen; $current_screen = WP_Screen::get( 'admin_init' ); $c = new GiglogAdmin_ConcertsTable(); $html = $c->render(); $current_screen = $oldscreen; $doc = DOMDocument::loadHTML($html); $forms = $doc->getElementsByTagName('form'); $assignit_count = 0; $adminactions_count = 0; foreach ($forms as $form) { $cls = $form->attributes->getNamedItem('class')->nodeValue; if ($cls == 'assign_concert' || $cls == 'unassign_concert') { $assignit_count++; } if ($cls == 'adminactions') { $adminactions_count++; } } $this->assertEquals(60, $assignit_count); // four for each gig $this->assertEquals(15, $adminactions_count); // once for each gig } function testDontShowAdminOnlyControlsToNonAdminsOnAdminPage() { global $current_screen; global $current_user; $current_user = $this->factory()->user->create_and_get(['role' => 'editor']); $oldscreen = $current_screen; $current_screen = WP_Screen::get( 'admin_init' ); $c = new GiglogAdmin_ConcertsTable(); $html = $c->render(); $current_screen = $oldscreen; $doc = DOMDocument::loadHTML($html); $forms = $doc->getElementsByTagName('form'); $assignit_count = 0; $adminactions_count = 0; foreach ($forms as $form) { $cls = $form->attributes->getNamedItem('class')->nodeValue; if ($cls == 'assign_concert' || $cls == 'unassign_concert') { $assignit_count++; } if ($cls == 'adminactions') { $adminactions_count++; } } $this->assertEquals(60, $assignit_count); // four for each gig $this->assertEquals(0, $adminactions_count); // once for each gig } function testDontShowAnyControlsIfNotOnAdminPage() { global $current_user; // "log in" as administrator to make sure no admin side stuff is // rendered on the public site, even if we're a high privilege user. $current_user = $this->factory()->user->create_and_get(['role' => 'administrator']); $c = new GiglogAdmin_ConcertsTable(); $html = $c->render(); $doc = DOMDocument::loadHTML($html); $forms = $doc->getElementsByTagName('form'); $assignit_count = 0; $adminactions_count = 0; foreach ($forms as $form) { $cls = $form->attributes->getNamedItem('class')->nodeValue; if ($cls == 'assign_concert' || $cls == 'unassign_concert') { $assignit_count++; } if ($cls == 'adminactions') { $adminactions_count++; } } $this->assertEquals(0, $assignit_count); // four for each gig $this->assertEquals(0, $adminactions_count); // once for each gig } }