diff --git a/.tests/lib/BaseDatabaseTestCase.php b/.tests/lib/BaseDatabaseTestCase.php
index 6740020..3303998 100644
--- a/.tests/lib/BaseDatabaseTestCase.php
+++ b/.tests/lib/BaseDatabaseTestCase.php
@@ -20,7 +20,7 @@ abstract class BaseDatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
protected $testTrackComment = "test track comment";
protected $testTimestamp = 1502974402;
protected $testLat = 0;
- protected $testLon = 10.01;
+ protected $testLon = 10.604001083;
protected $testAltitude = 10.01;
protected $testSpeed = 10.01;
protected $testBearing = 10.01;
@@ -100,6 +100,20 @@ abstract class BaseDatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
return $ret;
}
+ /**
+ * Execute raw insert query on database
+ *
+ * @param string $query Insert query
+ * @return int|null Last insert id if available, NULL otherwise
+ */
+ private function pdoInsertRaw($query) {
+ $ret = NULL;
+ if (self::$pdo->exec($query) !== false) {
+ $ret = self::$pdo->lastInsertId();
+ }
+ return $ret;
+ }
+
/**
* Get single column from first row of query result
*
@@ -143,7 +157,7 @@ abstract class BaseDatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
protected function addTestTrack($userId = NULL, $trackName = NULL, $comment = NULL) {
if (is_null($userId)) { $userId = $this->testUserId; }
if (is_null($trackName)) { $trackName = $this->testTrackName; }
- if (is_null($comment)) { $comment = $this->testComment; }
+ if (is_null($comment)) { $comment = $this->testTrackComment; }
return $this->pdoInsert('tracks', [ 'user_id' => $userId, 'name' => $trackName, 'comment' => $comment ]);
}
@@ -165,7 +179,9 @@ abstract class BaseDatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
if (is_null($latitude)) { $latitude = $this->testLat; }
if (is_null($longitude)) { $longitude = $this->testLon; }
- return $this->pdoInsert('positions', [ "user_id" => $userId, "track_id" => $trackId, "time" => date("Y-m-d H:m:s", $timeStamp), "latitude" => $latitude, "longitude" => $longitude ]);
+ $query = "INSERT INTO positions (user_id, track_id, time, latitude, longitude)
+ VALUES ('$userId', '$trackId', FROM_UNIXTIME($timeStamp), '$latitude', '$longitude')";
+ return $this->pdoInsertRaw($query);
}
}
?>
diff --git a/.tests/tests/ImportTest.php b/.tests/tests/ImportTest.php
new file mode 100644
index 0000000..28bd638
--- /dev/null
+++ b/.tests/tests/ImportTest.php
@@ -0,0 +1,810 @@
+assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx10 = '
+
+
+
+ ' . $this->testTrackName . '
+
+
+ ' . $this->testAltitude . '
+
+
+
+ ' . $this->testAltitude . '
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx10)
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => $this->testTimestamp,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => $this->testAltitude,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+
+ $expected = [
+ "id" => 2,
+ "time" => $this->testTimestamp + 1,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon * -1,
+ "altitude" => $this->testAltitude,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportGPX11() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx11 = '
+
+
+ ' . $this->testTrackComment . '
+ Track for testing ulogger
+
+ Bartek Fabiszewski
+ fabiszewski.net
+
+
+ Test, ulogger
+
+
+
+ Crafted by Bartek Fabiszewski
+ fabiszewski.net
+
+
+ ' . $this->testAltitude . '
+
+ 3d
+ 300300300
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx11),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => $this->testTrackComment
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => $this->testTimestamp,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => $this->testAltitude,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportExtensions() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+ ' . $this->testTrackComment . '
+
+
+
+ ' . $this->testTrackName . '
+
+
+ ' . $this->testAltitude . '
+
+ 1
+
+
+ ' . $this->testSpeed . '
+ ' . $this->testBearing . '
+ ' . $this->testAccuracy . '
+ ' . $this->testProvider . '
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => $this->testTrackComment
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => $this->testTimestamp,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => $this->testAltitude,
+ "speed" => $this->testSpeed,
+ "bearing" => $this->testBearing,
+ "accuracy" => $this->testAccuracy,
+ "provider" => $this->testProvider,
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportNoTime() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => 0,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => null,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportMultipleSegments() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status: $xml->message");
+ $this->assertEquals(1, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(1, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => $this->testTimestamp,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => null,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 2,
+ "time" => $this->testTimestamp + 1,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat + 1,
+ "longitude" => $this->testLon + 1,
+ "altitude" => null,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportMultipleTracks() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status: $xml->message");
+ $this->assertEquals(2, (int) $xml->trackid, "Wrong error message");
+ $this->assertEquals(2, (int) $xml->trackcnt, "Wrong error message");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $expected = [
+ "id" => 1,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 2,
+ "user_id" => 1,
+ "name" => $this->testTrackName,
+ "comment" => null
+ ];
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 1,
+ "time" => $this->testTimestamp,
+ "user_id" => 1,
+ "track_id" => 1,
+ "latitude" => $this->testLat,
+ "longitude" => $this->testLon,
+ "altitude" => null,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "positions",
+ "SELECT id, UNIX_TIMESTAMP(time) AS time, user_id, track_id, latitude, longitude,
+ altitude, speed, bearing, accuracy, provider, comment, image_id FROM positions"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $expected = [
+ "id" => 2,
+ "time" => $this->testTimestamp + 1,
+ "user_id" => 1,
+ "track_id" => 2,
+ "latitude" => $this->testLat + 1,
+ "longitude" => $this->testLon + 1,
+ "altitude" => null,
+ "speed" => null,
+ "bearing" => null,
+ "accuracy" => null,
+ "provider" => "gps",
+ "comment" => null,
+ "image_id" => null
+ ];
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ }
+
+ public function testImportNoLongitude() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+ }
+
+ public function testImportNoLatitude() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+ }
+
+ public function testImportNoGPX() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals($lang["iparsefailure"], (string) $xml->message, "Wrong error status");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+ }
+
+ public function testImportCorrupt() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $gpx = '
+
+
+
+
+ ';
+
+ $options = [
+ "http_errors" => false,
+ "multipart" => [
+ [
+ "name" => "gpx",
+ "contents" => $this->getStream($gpx),
+ "filename" => $this->testTrackName
+ ],
+ [
+ "name" => "MAX_FILE_SIZE",
+ "contents" => 300000
+ ]
+ ],
+ ];
+ $response = $this->http->post("/utils/import.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(0, strpos((string) $xml->message, $lang["iparsefailure"]), "Wrong error status");
+
+ $this->assertEquals(0, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(0, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+ }
+
+
+ private function getXMLfromResponse($response) {
+ $xml = false;
+ libxml_use_internal_errors(true);
+ try {
+ $xml = new SimpleXMLElement((string) $response->getBody());
+ } catch (Exception $e) { /* ignore */ }
+ return $xml;
+ }
+
+ private function getStream($string) {
+ $stream = tmpfile();
+ fwrite($stream, $string);
+ fseek($stream, 0);
+ return $stream;
+ }
+
+}
+
+?>
diff --git a/.tests/tests/InternalAPITest.php b/.tests/tests/InternalAPITest.php
new file mode 100644
index 0000000..48def87
--- /dev/null
+++ b/.tests/tests/InternalAPITest.php
@@ -0,0 +1,915 @@
+assertTrue($this->authenticate(), "Authentication failed");
+
+ $trackId = $this->addTestTrack($this->testUserId);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId, "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->position->count(), 2, "Wrong count of positions");
+
+ $position = $xml->position[0];
+ $this->assertEquals((int) $position["id"], 1, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testAdminUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+
+ $position = $xml->position[1];
+ $this->assertEquals((int) $position["id"], 2, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp + 1, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testAdminUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+ }
+
+ public function testGetPositionsUser() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $trackId = $this->addTestTrack($userId);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $userId, "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->position->count(), 2, "Wrong count of positions");
+
+ $position = $xml->position[0];
+ $this->assertEquals((int) $position["id"], 1, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+
+ $position = $xml->position[1];
+ $this->assertEquals((int) $position["id"], 2, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp + 1, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+ }
+
+ public function testGetPositionsOtherUser() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $userId);
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $trackId = $this->addTestTrack($userId);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId, "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->position->count(), 0, "Wrong count of positions");
+ }
+
+ public function testGetPositionsOtherUserByAdmin() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $userId);
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $trackId = $this->addTestTrack($userId);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($userId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $userId, "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->position->count(), 2, "Wrong count of positions");
+
+ $position = $xml->position[0];
+ $this->assertEquals((int) $position["id"], 1, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+
+ $position = $xml->position[1];
+ $this->assertEquals((int) $position["id"], 2, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp + 1, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+ }
+
+ public function testGetPositionsNoTrackId() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $trackId = $this->addTestTrack($this->testUserId);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->position->count(), 1, "Wrong count of positions");
+
+ $position = $xml->position[0];
+ $this->assertEquals((int) $position["id"], 2, "Wrong position id");
+ $this->assertEquals((float) $position->latitude, $this->testLat, "Wrong latitude");
+ $this->assertEquals((float) $position->longitude, $this->testLon, "Wrong longitude");
+ $this->assertEquals((int) $position->timestamp, $this->testTimestamp + 1, "Wrong timestamp");
+ $this->assertEquals((string) $position->username, $this->testAdminUser, "Wrong username");
+ $this->assertEquals((string) $position->trackname, $this->testTrackName, "Wrong trackname");
+ }
+
+ public function testGetPositionsNoUserId() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $trackId = $this->addTestTrack($this->testUserId);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp + 1);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("positions"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals($xml->position->count(), 0, "Wrong count of positions");
+ }
+
+ public function testGetPositionsNoAuth() {
+
+ $trackId = $this->addTestTrack($this->testUserId);
+ $this->addTestPosition($this->testUserId, $trackId, $this->testTimestamp);
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId, "trackid" => $trackId ],
+ ];
+ $response = $this->http->post("/utils/getpositions.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals($xml->position->count(), 0, "Wrong count of positions");
+ }
+
+
+ /* gettracks.php */
+
+
+ public function testGetTracksAdmin() {
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $this->addTestTrack($this->testUserId);
+ $this->addTestTrack($this->testUserId, $this->testTrackName . "2");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId ],
+ ];
+ $response = $this->http->post("/utils/gettracks.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->track->count(), 2, "Wrong count of tracks");
+
+ $track = $xml->track[0];
+ $this->assertEquals((int) $track->trackid, $this->testTrackId2, "Wrong track id");
+ $this->assertEquals((string) $track->trackname, $this->testTrackName . "2", "Wrong track name");
+
+ $track = $xml->track[1];
+ $this->assertEquals((int) $track->trackid, $this->testTrackId, "Wrong track id");
+ $this->assertEquals((string) $track->trackname, $this->testTrackName, "Wrong track name");
+ }
+
+ public function testGetTracksUser() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $this->addTestTrack($userId);
+ $this->addTestTrack($userId, $this->testTrackName . "2");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $userId ],
+ ];
+ $response = $this->http->post("/utils/gettracks.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->track->count(), 2, "Wrong count of tracks");
+
+ $track = $xml->track[0];
+ $this->assertEquals((int) $track->trackid, $this->testTrackId2, "Wrong track id");
+ $this->assertEquals((string) $track->trackname, $this->testTrackName . "2", "Wrong track name");
+
+ $track = $xml->track[1];
+ $this->assertEquals((int) $track->trackid, $this->testTrackId, "Wrong track id");
+ $this->assertEquals((string) $track->trackname, $this->testTrackName, "Wrong track name");
+ }
+
+ public function testGetTracksOtherUser() {
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $this->addTestTrack($this->testUserId);
+ $this->addTestTrack($this->testUserId, $this->testTrackName . "2");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId ],
+ ];
+ $response = $this->http->post("/utils/gettracks.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals($xml->track->count(), 0, "Wrong count of tracks");
+ }
+
+ public function testGetTracksNoUserId() {
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $this->addTestTrack($this->testUserId);
+ $this->addTestTrack($this->testUserId, $this->testTrackName . "2");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ ];
+ $response = $this->http->post("/utils/gettracks.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals($xml->track->count(), 0, "Wrong count of tracks");
+ }
+
+ public function testGetTracksNoAuth() {
+
+ $this->addTestTrack($this->testUserId);
+ $this->addTestTrack($this->testUserId, $this->testTrackName . "2");
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId ],
+ ];
+ $response = $this->http->post("/utils/gettracks.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals($xml->track->count(), 0, "Wrong count of tracks");
+ }
+
+
+ /* changepass.php */
+
+ public function testChangePassNoAuth() {
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "userid" => $this->testUserId ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(401, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "Unauthorized", "Wrong error message");
+ }
+
+ public function testChangePassEmpty() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "login" => $this->testAdminUser ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "Empty password", "Wrong error message");
+ }
+
+ public function testChangePassNoUser() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "login" => $this->testUser,
+ "pass" => $this->testPass,
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "User unknown", "Wrong error message");
+ }
+
+ public function testChangePassWrongOldpass() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "oldpass" => "badpass",
+ "pass" => "newpass",
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "Wrong old password", "Wrong error message");
+ }
+
+ public function testChangePassNoOldpass() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "pass" => "newpass",
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "Wrong old password", "Wrong error message");
+ }
+
+ public function testChangePassSelfAdmin() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $newPass = "newpass";
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "oldpass" => $this->testAdminPass,
+ "pass" => $newPass,
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertTrue(password_verify($newPass, $this->pdoGetColumn("SELECT password FROM users")), "Wrong actual password hash");
+ }
+
+ public function testChangePassSelfUser() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $newPass = "newpass";
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "oldpass" => $this->testPass,
+ "pass" => $newPass,
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertTrue(password_verify($newPass, $this->pdoGetColumn("SELECT password FROM users WHERE id = $userId")), "Wrong actual password hash");
+ }
+
+ public function testChangePassOtherAdmin() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+
+ $newPass = "newpass";
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "login" => $this->testUser,
+ "pass" => $newPass,
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertTrue(password_verify($newPass, $this->pdoGetColumn("SELECT password FROM users WHERE id = $userId")), "Wrong actual password hash");
+ }
+
+ public function testChangePassOtherUser() {
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $userId2 = $this->addTestUser($this->testUser2, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $newPass = "newpass";
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [
+ "login" => $this->testUser2,
+ "pass" => $newPass,
+ ],
+ ];
+ $response = $this->http->post("/utils/changepass.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is not false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, "Unauthorized", "Wrong error message");
+ }
+
+ /* handletrack.php */
+
+ public function testHandleTrackDeleteAdmin() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $trackId = $this->addTestTrack($userId);
+ $trackId2 = $this->addTestTrack($userId);
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId, "action" => "delete" ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals($trackId2, $this->pdoGetColumn("SELECT id FROM tracks WHERE id = $trackId2"), "Wrong actual track id");
+ }
+
+ public function testHandleTrackDeleteSelf() {
+ global $lang;
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $trackId = $this->addTestTrack($userId);
+ $trackId2 = $this->addTestTrack($userId);
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId, "action" => "delete" ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertEquals($trackId2, $this->pdoGetColumn("SELECT id FROM tracks WHERE id = $trackId2"), "Wrong actual track id");
+ }
+
+ public function testHandleTrackDeleteOtherUser() {
+ global $lang;
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $trackId = $this->addTestTrack($this->testUserId);
+
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId, "action" => "delete" ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ }
+
+ public function testHandleTrackUpdate() {
+ global $lang;
+ $newName = "New name";
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $trackId = $this->addTestTrack($userId);
+ $trackId2 = $this->addTestTrack($userId);
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId, "action" => "update", "trackname" => $newName ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 0, "Wrong error status");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $row1 = [
+ "id" => $trackId2,
+ "user_id" => $userId,
+ "name" => $this->testTrackName,
+ "comment" => $this->testTrackComment
+ ];
+ $row2 = [
+ "id" => $trackId,
+ "user_id" => $userId,
+ "name" => $newName,
+ "comment" => $this->testTrackComment
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "tracks",
+ "SELECT * FROM tracks"
+ );
+ $this->assertTableContains($row1, $actual, "Wrong actual table data");
+ $this->assertTableContains($row2, $actual, "Wrong actual table data");
+ }
+
+ public function testHandleTrackUpdateEmptyName() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $trackId = $this->addTestTrack($userId);
+ $trackId2 = $this->addTestTrack($userId);
+
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $trackId, "action" => "update", "trackname" => "" ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ }
+
+ public function testHandleTrackUpdateNonexistantTrack() {
+ global $lang;
+ $newName = "New name";
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $userId = $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $trackId = $this->addTestTrack($userId);
+ $nonexistantTrackId = $trackId + 1;
+ $this->assertEquals(1, $this->getConnection()->getRowCount("tracks"), "Wrong row count");
+ $this->assertFalse($this->pdoGetColumn("SELECT id FROM tracks WHERE id = $nonexistantTrackId"), "Nonexistant track exists");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "trackid" => $nonexistantTrackId, "action" => "update", "trackname" => $newName ],
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ }
+
+ public function testHandleTrackMissingAction() {
+ global $lang;
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ ];
+ $response = $this->http->post("/utils/handletrack.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ }
+
+
+ /* handleuser.php */
+
+ public function testHandleUserMissingAction() {
+ global $lang;
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ }
+
+ public function testHandleUserNonAdmin() {
+ global $lang;
+
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue($this->authenticate($this->testUser, $this->testPass), "Authentication failed");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "delete", "login" => "test" ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ }
+
+ public function testHandleUserSelf() {
+ global $lang;
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "delete", "login" => $this->testAdminUser ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ }
+
+ public function testHandleUserEmptyLogin() {
+ global $lang;
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "delete", "login" => "" ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ }
+
+ public function testHandleUserNoAuth() {
+ global $lang;
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "delete", "login" => $this->testUser ],
+
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals((int) $xml->error, 1, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ }
+
+ public function testHandleUserAdd() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "add", "login" => $this->testUser, "pass" => $this->testPass ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $expected = [
+ "login" => $this->testUser,
+ ];
+ $actual = $this->getConnection()->createQueryTable(
+ "users",
+ "SELECT login FROM users"
+ );
+ $this->assertTableContains($expected, $actual, "Wrong actual table data");
+ $this->assertTrue(password_verify($this->testPass, $this->pdoGetColumn("SELECT password FROM users WHERE login = '$this->testUser'")), "Wrong actual password hash");
+ }
+
+ public function testHandleUserAddSameLogin() {
+ global $lang;
+
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "add", "login" => $this->testUser, "pass" => $this->testPass ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["userexists"], "Wrong error message");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ }
+
+ public function testHandleUserUpdate() {
+ $newPass = $this->testPass . "new";
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "update", "login" => $this->testUser, "pass" => $newPass ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue(password_verify($newPass, $this->pdoGetColumn("SELECT password FROM users WHERE login = '$this->testUser'")), "Wrong actual password hash");
+ }
+
+ public function testHandleUserUpdateEmptyPass() {
+ global $lang;
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "update", "login" => $this->testUser, "pass" => "" ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(1, (int) $xml->error, "Wrong error status");
+ $this->assertEquals((string) $xml->message, $lang["servererror"], "Wrong error message");
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ $this->assertTrue(password_verify($this->testPass, $this->pdoGetColumn("SELECT password FROM users WHERE login = '$this->testUser'")), "Wrong actual password hash");
+ }
+
+ public function testHandleUserDelete() {
+ $this->assertTrue($this->authenticate(), "Authentication failed");
+ $this->addTestUser($this->testUser, password_hash($this->testPass, PASSWORD_DEFAULT));
+ $this->assertEquals(2, $this->getConnection()->getRowCount("users"), "Wrong row count");
+
+ $options = [
+ "http_errors" => false,
+ "form_params" => [ "action" => "delete", "login" => $this->testUser ],
+ ];
+ $response = $this->http->post("/utils/handleuser.php", $options);
+ $this->assertEquals(200, $response->getStatusCode(), "Unexpected status code");
+ $xml = $this->getXMLfromResponse($response);
+ $this->assertTrue($xml !== false, "XML object is false");
+ $this->assertEquals(0, (int) $xml->error, "Wrong error status");
+ $this->assertEquals(1, $this->getConnection()->getRowCount("users"), "Wrong row count");
+ }
+
+
+ private function getXMLfromResponse($response) {
+ $xml = false;
+ libxml_use_internal_errors(true);
+ try {
+ $xml = new SimpleXMLElement((string) $response->getBody());
+ } catch (Exception $e) { /* ignore */ }
+ return $xml;
+ }
+
+}
+
+?>
\ No newline at end of file