summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--includes/admin/views/giglog_admin_page.php10
-rw-r--r--includes/admin/views/giglog_import_gigs.php3
-rw-r--r--includes/venue.php75
-rw-r--r--tests/VenueTest.php92
-rw-r--r--tests/stubs/wpdb_stub.php9
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();