diff options
-rw-r--r-- | includes/admin/views/giglog_admin_page.php | 10 | ||||
-rw-r--r-- | includes/admin/views/giglog_import_gigs.php | 3 | ||||
-rw-r--r-- | includes/venue.php | 75 | ||||
-rw-r--r-- | tests/VenueTest.php | 92 | ||||
-rw-r--r-- | tests/stubs/wpdb_stub.php | 9 |
5 files changed, 174 insertions, 15 deletions
diff --git a/includes/admin/views/giglog_admin_page.php b/includes/admin/views/giglog_admin_page.php index b7d8397..5fdcc6b 100644 --- a/includes/admin/views/giglog_admin_page.php +++ b/includes/admin/views/giglog_admin_page.php @@ -60,7 +60,7 @@ if ( !class_exists( 'GiglogAdmin_AdminPage' ) ) { { $select = '<select name="selectvenue">'; foreach ( GiglogAdmin_Venue::all_venues() AS $venue ) { - $select .= '<option value="' . $venue -> id. '">'.$venue->vname; + $select .= '<option value="' . $venue->id() . '">'. $venue->name(); $select .='</option>'; } $select .= '</select>'; @@ -98,7 +98,13 @@ if ( !class_exists( 'GiglogAdmin_AdminPage' ) ) { if ( $selected_city != "ALL" ) { //second drop down for venue - $venues = array_merge([[0, "ALL"]], GiglogAdmin_Venue::venues_in_city($selected_city)); + $venues = GiglogAdmin_Venue::venues_in_city($selected_city); + $venue_list = array_merge( + [0, "ALL"], + array_map( + function($v) { return [$v->id(), $v->name()]; }, + $venues)); + $selected_venue = filter_input(INPUT_POST, "selectvenue", FILTER_SANITIZE_SPECIAL_CHARS) || $venues[0]; diff --git a/includes/admin/views/giglog_import_gigs.php b/includes/admin/views/giglog_import_gigs.php index 5874ef8..2423c74 100644 --- a/includes/admin/views/giglog_import_gigs.php +++ b/includes/admin/views/giglog_import_gigs.php @@ -85,7 +85,8 @@ if ( !class_exists( 'GiglogAdmin_ImportGigsPage' ) ) { if (is_numeric($venue)) $newconcert[1] = $venue; else { - $newconcert[1] = GiglogAdmin_Venue::find_or_create($venue); + $v = GiglogAdmin_Venue::find_or_create($venue); + $newconcert[1] = $v->id(); } //not sure how to check dates, hopefully manual verification of files will take care of it diff --git a/includes/venue.php b/includes/venue.php index 4951d6b..08e8bb5 100644 --- a/includes/venue.php +++ b/includes/venue.php @@ -19,26 +19,50 @@ if ( !class_exists('GiglogAdmin_Venue') ) { class GiglogAdmin_Venue { - static function create($name) + private $id; + private $name; + private $city; + private $address; + private $webpage; + + /* + * Constructs a new venue object from an array of attributes. + * The attributes are expected to be named as in the database, + * so this constructor can be used to construct the object + * directly from the database row. + */ + private function __construct($attrs) { - global $wpdb; + $this->id = isset($attrs->id) ? $attrs->id : NULL; + $this->name = isset($attrs->wpgvenue_name) ? $attrs->wpgvenue_name : NULL; + $this->city = isset($attrs->wpgvenue_city) ? $attrs->wpgvenue_city : NULL; + $this->address = isset($attrs->wpgvenue_address) ? $attrs->wpgvenue_address : NULL; + $this->webpage = isset($attrs->wpgvenue_webpage) ? $attrs->wpgvenue_webpage : NULL; + } - $wpdb->insert('wpg_venues', array( - 'id' => '', - 'wpgvenue_name' => $name - )); + static function create($name) + { + $attrs = new stdClass(); + $attrs->wpgvenue_name = $name; + $venue = new GiglogAdmin_Venue($attrs); + $venue->save(); - return $wpdb->insert_id; + return $venue; } static function find_or_create($name) { global $wpdb; - $venuesql = 'SELECT id FROM wpg_venues WHERE upper(wpgvenue_name)="' . $name . '"'; + $venuesql = 'SELECT * FROM wpg_venues WHERE upper(wpgvenue_name)="' . $name . '"'; $results = $wpdb->get_results($venuesql); - return $results ? $results[0]->id : GiglogAdmin_Venue::create($name); + if ($results) { + return new GiglogAdmin_Venue($results[0]); + } + else { + return GiglogAdmin_Venue::create($name); + } } static function all_cities() @@ -53,9 +77,9 @@ if ( !class_exists('GiglogAdmin_Venue') ) { { global $wpdb; - $results = $wpdb->get_results("select id, CONCAT( IFNULL(wpgvenue_name,''),'-',IFNULL(wpgvenue_city,'')) as vname from wpg_venues"); + $results = $wpdb->get_results("select * from wpg_venues"); - return ($results); + return array_map(function ($r) { return new GiglogAdmin_Venue($r); }, $results); } @@ -66,7 +90,34 @@ if ( !class_exists('GiglogAdmin_Venue') ) { "select id, wpgvenue_name from wpg_venues where wpgvenue_city=?", $city); $results = $wpdb->get_results($q); - return array_map(function ($r) { return [$r->id, $r->wpgvenue_name]; }, $results); + return array_map(function ($r) { return new GiglogAdmin_Venue($r); }, $results); + } + + public function save() + { + global $wpdb; + + $wpdb->insert('wpg_venues', array( + 'id' => '', + 'wpgvenue_name' => $this->name + )); + + $this->id = $wpdb->insert_id; + } + + public function id() + { + return $this->id; + } + + public function name() + { + return $this->name; + } + + public function city() + { + return $this->city; } } } diff --git a/tests/VenueTest.php b/tests/VenueTest.php new file mode 100644 index 0000000..814bfe8 --- /dev/null +++ b/tests/VenueTest.php @@ -0,0 +1,92 @@ +<?php +declare(strict_types=1); + +use PHPUnit\Framework\TestCase; + +require 'tests/stubs/wpdb_stub.php'; +require 'includes/venue.php'; + +final class VenueTest extends TestCase +{ + public function testCreatingVenueWithName(): void + { + $venue = GiglogAdmin_Venue::create("Svene Samfunns- og Bedehus"); + $this->assertEquals("Svene Samfunns- og Bedehus", $venue->name()); + $this->assertEquals(1, $venue->id()); + } + + public function testFindOrCreateNonExistingVenue() : void + { + $venue = GiglogAdmin_Venue::find_or_create("Svene Samfunns- og Bedehus"); + $this->assertEquals("Svene Samfunns- og Bedehus", $venue->name()); + $this->assertEquals(1, $venue->id()); + } + + public function testFindOrCreateExistingVenue() : void + { + global $wpdb; + + $v = new stdClass(); + $v->id = 42; + $v->wpgvenue_name = 'Slarkhaillen'; + $v->wpgvenue_city = 'Ofoten'; + $v->wpgvenue_address = 'Baillsvingen 4'; + $v->wpgvenue_webpage = 'https://slarkhaillen.no'; + + $wpdb = $this->createStub(wpdb::class); + $wpdb->method('get_results')->willReturn(array($v)); + $venue = GiglogAdmin_Venue::find_or_create("Slarkhaillen"); + + $this->assertEquals(42, $venue->id()); + $this->assertEquals($v->wpgvenue_name, $venue->name()); + } + + public function testFindAllVenuesInCity() : void + { + global $wpdb; + + $results = array(); + for ($i = 0; $i < 3; $i++) { + $results[$i] = new stdClass(); + $results[$i]->id = 42 + $i; + $results[$i]->wpgvenue_name = "Venue #" . $i; + $results[$i]->wpgvenue_city = "Osaka"; + } + + $wpdb = $this->createStub(wpdb::class); + $wpdb->method('prepare')->willReturn("prepared"); + $wpdb->method('get_results')->willReturn($results); + + $venues = GiglogAdmin_Venue::venues_in_city("Osaka"); + + for ($i = 0; $i < 3; $i++) { + $this->assertEquals("Osaka", $venues[$i]->city()); + $this->assertEquals("Venue #" . $i, $venues[$i]->name()); + $this->assertEquals(42 + $i, $venues[$i]->id()); + } + } + + public function testFindAllVenues() : void + { + global $wpdb; + + $results = array(); + for ($i = 0; $i < 3; $i++) { + $results[$i] = new stdClass(); + $results[$i]->id = 42 + $i; + $results[$i]->wpgvenue_name = "Venue #" . $i; + $results[$i]->wpgvenue_city = "City #" . $i; + } + + $wpdb = $this->createStub(wpdb::class); + $wpdb->method('get_results')->willReturn($results); + + $venues = GiglogAdmin_Venue::all_venues(); + + for ($i = 0; $i < 3; $i++) { + $this->assertEquals("City #" . $i, $venues[$i]->city()); + $this->assertEquals("Venue #" . $i, $venues[$i]->name()); + $this->assertEquals(42 + $i, $venues[$i]->id()); + } + } +} diff --git a/tests/stubs/wpdb_stub.php b/tests/stubs/wpdb_stub.php new file mode 100644 index 0000000..72312bc --- /dev/null +++ b/tests/stubs/wpdb_stub.php @@ -0,0 +1,9 @@ +<?php +class wpdb { + public $insert_id = NULL; + public function insert(string $table, array $data) { $this->insert_id = 1; } + public function prepare(string $query, mixed $args) { return "prepared"; } + public function get_results(string $query) { return NULL; } +} + +$wpdb = new wpdb(); |