diff options
author | Harald Eilertsen <haraldei@anduin.net> | 2021-04-10 13:36:28 +0200 |
---|---|---|
committer | Harald Eilertsen <haraldei@anduin.net> | 2021-04-10 14:19:50 +0200 |
commit | 029f4d7a5b9aff1f7b35f060d172611ef81a2943 (patch) | |
tree | 9d16309995e120cff7b9488eb06ef45d7aebf108 | |
parent | 410135aca1c07409f5909b44dc144bb2c3644645 (diff) | |
download | gigologadmin-029f4d7a5b9aff1f7b35f060d172611ef81a2943.tar.gz gigologadmin-029f4d7a5b9aff1f7b35f060d172611ef81a2943.tar.bz2 gigologadmin-029f4d7a5b9aff1f7b35f060d172611ef81a2943.zip |
Change venues into proper objects.
This means most static functions now either return a venue object, or an
array of venue objects. The exception is the `all_cities` method, which
still return an array of cities as strings.
The constructor has been made private, as it should not be used directly
from anywhere but the static methods on the Venue class.
-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(); |