diff --git a/.travis.yml b/.travis.yml
index 6033e8fa..7c82d2a2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,9 +38,11 @@ before_script:
- php artisan migrate
- php artisan db:seed
- php artisan token:generate
+ - phantomjs --webserver=127.0.0.1:9515 &
- php artisan serve &
- sleep 5 # Give artisan some time to start serving
script:
- phpdbg -qrr vendor/bin/phpunit --coverage-text
+ - php artisan dusk
- php artisan security:check
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
index 3c5c8377..d3aa0488 100644
--- a/app/Providers/AppServiceProvider.php
+++ b/app/Providers/AppServiceProvider.php
@@ -5,6 +5,7 @@ namespace App\Providers;
use App\Tag;
use App\Note;
use Validator;
+use Laravel\Dusk\DuskServiceProvider;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@@ -54,6 +55,8 @@ class AppServiceProvider extends ServiceProvider
*/
public function register()
{
- //
+ if ($this->app->environment('local', 'testing')) {
+ $this->app->register(DuskServiceProvider::class);
+ }
}
}
diff --git a/composer.json b/composer.json
index 8b6e90f1..d37abaea 100644
--- a/composer.json
+++ b/composer.json
@@ -29,14 +29,12 @@
"laravel/tinker": "^1.0"
},
"require-dev": {
- "fzaninotto/faker": "~1.4",
- "mockery/mockery": "0.9.*",
- "phpunit/phpunit": "~5.7",
- "symfony/css-selector": "3.1.*",
- "symfony/dom-crawler": "3.1.*",
"barryvdh/laravel-debugbar": "~2.0",
+ "fzaninotto/faker": "~1.4",
"jakub-onderka/php-parallel-lint": "^0.9.2",
- "laravel/browser-kit-testing": "^1.0"
+ "laravel/dusk": "^1.0",
+ "mockery/mockery": "0.9.*",
+ "phpunit/phpunit": "~5.7"
},
"autoload": {
"classmap": [
@@ -47,10 +45,9 @@
}
},
"autoload-dev": {
- "classmap": [
- "tests/TestCase.php",
- "tests/BrowserKitTest.php"
- ]
+ "psr-4": {
+ "Tests\\": "tests"
+ }
},
"scripts": {
"post-root-package-install": [
diff --git a/composer.lock b/composer.lock
index eae3833f..56ab84cb 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "16af842252275cac279c7f118ad6e6d4",
+ "content-hash": "e4236aef74a9e56de4a85dc50bf32dcf",
"packages": [
{
"name": "anahkiasen/underscore-php",
@@ -58,16 +58,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.22.4",
+ "version": "3.22.7",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "916f708c1a643f86f74eacd3c5be787b40d814f8"
+ "reference": "eea83aaac2b6c86f72a5c85c54d1839b70d4fd21"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/916f708c1a643f86f74eacd3c5be787b40d814f8",
- "reference": "916f708c1a643f86f74eacd3c5be787b40d814f8",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/eea83aaac2b6c86f72a5c85c54d1839b70d4fd21",
+ "reference": "eea83aaac2b6c86f72a5c85c54d1839b70d4fd21",
"shasum": ""
},
"require": {
@@ -134,7 +134,7 @@
"s3",
"sdk"
],
- "time": "2017-02-14T21:23:54+00:00"
+ "time": "2017-02-17T20:09:40+00:00"
},
{
"name": "barnabywalters/mf-cleaner",
@@ -3280,16 +3280,16 @@
},
{
"name": "symfony/console",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "7a8405a9fc175f87fed8a3c40856b0d866d61936"
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/7a8405a9fc175f87fed8a3c40856b0d866d61936",
- "reference": "7a8405a9fc175f87fed8a3c40856b0d866d61936",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
"shasum": ""
},
"require": {
@@ -3339,20 +3339,20 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2017-02-06T12:04:21+00:00"
+ "time": "2017-02-16T14:07:22+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v3.1.10",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d"
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d",
- "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
"shasum": ""
},
"require": {
@@ -3361,7 +3361,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-master": "3.2-dev"
}
},
"autoload": {
@@ -3392,20 +3392,20 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2017-01-02T20:31:54+00:00"
+ "time": "2017-01-02T20:32:22+00:00"
},
{
"name": "symfony/debug",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "b4d9818f127c60ce21ed62c395da7df868dc8477"
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/b4d9818f127c60ce21ed62c395da7df868dc8477",
- "reference": "b4d9818f127c60ce21ed62c395da7df868dc8477",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
"shasum": ""
},
"require": {
@@ -3449,11 +3449,11 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2017-01-28T02:37:08+00:00"
+ "time": "2017-02-16T16:34:18+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
@@ -3513,7 +3513,7 @@
},
{
"name": "symfony/finder",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
@@ -3562,16 +3562,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "e192b04de44aa1ed0e39d6793f7e06f5e0b672a0"
+ "reference": "a90da6dd679605d88c9803a57a6fc1fb7a19a6e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e192b04de44aa1ed0e39d6793f7e06f5e0b672a0",
- "reference": "e192b04de44aa1ed0e39d6793f7e06f5e0b672a0",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a90da6dd679605d88c9803a57a6fc1fb7a19a6e0",
+ "reference": "a90da6dd679605d88c9803a57a6fc1fb7a19a6e0",
"shasum": ""
},
"require": {
@@ -3611,20 +3611,20 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2017-02-02T13:47:35+00:00"
+ "time": "2017-02-16T22:46:52+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "96443239baf674b143604fb87cb27cb01672ab77"
+ "reference": "4cd0d4bc31819095c6ef13573069f621eb321081"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96443239baf674b143604fb87cb27cb01672ab77",
- "reference": "96443239baf674b143604fb87cb27cb01672ab77",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4cd0d4bc31819095c6ef13573069f621eb321081",
+ "reference": "4cd0d4bc31819095c6ef13573069f621eb321081",
"shasum": ""
},
"require": {
@@ -3693,7 +3693,7 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2017-02-06T13:15:19+00:00"
+ "time": "2017-02-16T23:59:56+00:00"
},
{
"name": "symfony/polyfill-mbstring",
@@ -3756,16 +3756,16 @@
},
{
"name": "symfony/process",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "32646a7cf53f3956c76dcb5c82555224ae321858"
+ "reference": "0ab87c1e7570b3534a6e51eb4ca8e9f6d7327856"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/32646a7cf53f3956c76dcb5c82555224ae321858",
- "reference": "32646a7cf53f3956c76dcb5c82555224ae321858",
+ "url": "https://api.github.com/repos/symfony/process/zipball/0ab87c1e7570b3534a6e51eb4ca8e9f6d7327856",
+ "reference": "0ab87c1e7570b3534a6e51eb4ca8e9f6d7327856",
"shasum": ""
},
"require": {
@@ -3801,11 +3801,11 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2017-02-03T12:11:38+00:00"
+ "time": "2017-02-16T14:07:22+00:00"
},
{
"name": "symfony/routing",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
@@ -3880,16 +3880,16 @@
},
{
"name": "symfony/translation",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "ca032cc56976d88b85e7386b17020bc6dc95dbc5"
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/ca032cc56976d88b85e7386b17020bc6dc95dbc5",
- "reference": "ca032cc56976d88b85e7386b17020bc6dc95dbc5",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029",
"shasum": ""
},
"require": {
@@ -3940,20 +3940,20 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:06:35+00:00"
+ "time": "2017-02-16T22:46:52+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "5bb4435a03a4f05c211f4a9a8ee2756965924511"
+ "reference": "cb50260b674ee1c2d4ab49f2395a42e0b4681e20"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5bb4435a03a4f05c211f4a9a8ee2756965924511",
- "reference": "5bb4435a03a4f05c211f4a9a8ee2756965924511",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cb50260b674ee1c2d4ab49f2395a42e0b4681e20",
+ "reference": "cb50260b674ee1c2d4ab49f2395a42e0b4681e20",
"shasum": ""
},
"require": {
@@ -4003,7 +4003,7 @@
"debug",
"dump"
],
- "time": "2017-01-24T12:58:58+00:00"
+ "time": "2017-02-16T22:46:52+00:00"
},
{
"name": "themattharris/tmhoauth",
@@ -4298,6 +4298,55 @@
],
"time": "2015-06-14T21:17:01+00:00"
},
+ {
+ "name": "facebook/webdriver",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/facebook/php-webdriver.git",
+ "reference": "77300c4ab2025d4316635f592ec849ca7323bd8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/77300c4ab2025d4316635f592ec849ca7323bd8c",
+ "reference": "77300c4ab2025d4316635f592ec849ca7323bd8c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^5.5 || ~7.0",
+ "symfony/process": "^2.8 || ^3.1"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^1.11",
+ "php-mock/php-mock-phpunit": "^1.1",
+ "phpunit/phpunit": "4.6.* || ~5.0",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "^2.6"
+ },
+ "suggest": {
+ "phpdocumentor/phpdocumentor": "2.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Facebook\\WebDriver\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "A PHP client for WebDriver",
+ "homepage": "https://github.com/facebook/php-webdriver",
+ "keywords": [
+ "facebook",
+ "php",
+ "selenium",
+ "webdriver"
+ ],
+ "time": "2017-01-13T15:48:08+00:00"
+ },
{
"name": "fzaninotto/faker",
"version": "v1.6.0",
@@ -4439,23 +4488,30 @@
"time": "2015-12-15T10:42:16+00:00"
},
{
- "name": "laravel/browser-kit-testing",
- "version": "v1.0.3",
+ "name": "laravel/dusk",
+ "version": "v1.0.6",
"source": {
"type": "git",
- "url": "https://github.com/laravel/browser-kit-testing.git",
- "reference": "0adfb725147815bff5516d157577f375a6e66ebd"
+ "url": "https://github.com/laravel/dusk.git",
+ "reference": "804bf2ef20de7d86caac1aff433c761399b55e56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/0adfb725147815bff5516d157577f375a6e66ebd",
- "reference": "0adfb725147815bff5516d157577f375a6e66ebd",
+ "url": "https://api.github.com/repos/laravel/dusk/zipball/804bf2ef20de7d86caac1aff433c761399b55e56",
+ "reference": "804bf2ef20de7d86caac1aff433c761399b55e56",
"shasum": ""
},
"require": {
- "php": ">=5.5.9",
- "symfony/css-selector": "~3.1",
- "symfony/dom-crawler": "~3.1"
+ "facebook/webdriver": "~1.0",
+ "illuminate/support": "~5.3",
+ "nesbot/carbon": "~1.20",
+ "php": ">=5.6.4",
+ "symfony/console": "~3.2",
+ "symfony/process": "~3.2"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.6",
+ "phpunit/phpunit": "^5.7"
},
"type": "library",
"extra": {
@@ -4465,7 +4521,7 @@
},
"autoload": {
"psr-4": {
- "Laravel\\BrowserKitTesting\\": "src/"
+ "Laravel\\Dusk\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4478,12 +4534,13 @@
"email": "taylor@laravel.com"
}
],
- "description": "Provides backwards compatibility for BrowserKit testing in Laravel 5.4.",
+ "description": "Laravel Dusk provides simple end-to-end testing and browser automation.",
"keywords": [
"laravel",
- "testing"
+ "testing",
+ "webdriver"
],
- "time": "2017-02-08T22:32:37+00:00"
+ "time": "2017-02-15T20:21:39+00:00"
},
{
"name": "maximebf/debugbar",
@@ -5760,74 +5817,18 @@
"homepage": "https://github.com/sebastianbergmann/version",
"time": "2016-10-03T07:35:21+00:00"
},
- {
- "name": "symfony/dom-crawler",
- "version": "v3.1.10",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/dom-crawler.git",
- "reference": "7eede2a901a19928494194f7d1815a77b9a473a0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7eede2a901a19928494194f7d1815a77b9a473a0",
- "reference": "7eede2a901a19928494194f7d1815a77b9a473a0",
- "shasum": ""
- },
- "require": {
- "php": ">=5.5.9",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "require-dev": {
- "symfony/css-selector": "~2.8|~3.0"
- },
- "suggest": {
- "symfony/css-selector": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\DomCrawler\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony DomCrawler Component",
- "homepage": "https://symfony.com",
- "time": "2017-01-21T17:13:55+00:00"
- },
{
"name": "symfony/yaml",
- "version": "v3.2.3",
+ "version": "v3.2.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "e1718c6bf57e1efbb8793ada951584b2ab27775b"
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/e1718c6bf57e1efbb8793ada951584b2ab27775b",
- "reference": "e1718c6bf57e1efbb8793ada951584b2ab27775b",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
"shasum": ""
},
"require": {
@@ -5869,7 +5870,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:06:35+00:00"
+ "time": "2017-02-16T22:46:52+00:00"
},
{
"name": "webmozart/assert",
diff --git a/phpunit.xml b/phpunit.xml
index 3e884d17..88860829 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -9,16 +9,16 @@
processIsolation="false"
stopOnFailure="false">
-
- ./tests
+
+ ./tests/Feature
+
+
+ ./tests/Unit
./app
-
- ./app/Http/routes.php
-
diff --git a/tests/ArticlesTest.php b/tests/ArticlesTest.php
deleted file mode 100644
index 850adeee..00000000
--- a/tests/ArticlesTest.php
+++ /dev/null
@@ -1,78 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test the `/blog` page returns the article, this
- * means the database is being hit.
- *
- * @return void
- */
- public function testArticlesPage()
- {
- $this->visit($this->appurl . '/blog')
- ->see('My New Blog');
- }
-
- /**
- * Test the `/blog/{year}` page returns the article, this
- * means the database is being hit.
- *
- * @return void
- */
- public function testArticlesYearPage()
- {
- $this->visit($this->appurl . '/blog/2016')
- ->see('My New Blog');
- }
-
- /**
- * Test the `/blog/{year}/{month}` page returns the article,
- * this means the database is being hit.
- *
- * @return void
- */
- public function testArticlesMonthPage()
- {
- $this->visit($this->appurl . '/blog/2016/01')
- ->see('My New Blog');
- }
-
- /**
- * Test a single article page.
- *
- * @return void
- */
- public function testSingleArticlePage()
- {
- $this->visit($this->appurl . '/blog/2016/01/my-new-blog')
- ->see('My New Blog');
- }
-
- /**
- * Test the RSS feed.
- *
- * @return void
- */
- public function testRSSFeed()
- {
- $response = $this->call('GET', $this->appurl . '/feed');
-
- $this->assertEquals('application/rss+xml', $response->headers->get('Content-Type'));
- }
-}
diff --git a/tests/Browser/ExampleTest.php b/tests/Browser/ExampleTest.php
new file mode 100644
index 00000000..b388384d
--- /dev/null
+++ b/tests/Browser/ExampleTest.php
@@ -0,0 +1,23 @@
+browse(function (Browser $browser) {
+ $browser->visit('/')
+ ->assertSee('Jonny Barnes');
+ });
+ }
+}
diff --git a/tests/Browser/Pages/HomePage.php b/tests/Browser/Pages/HomePage.php
new file mode 100644
index 00000000..c04a7f0a
--- /dev/null
+++ b/tests/Browser/Pages/HomePage.php
@@ -0,0 +1,40 @@
+ '#selector',
+ ];
+ }
+}
diff --git a/tests/Browser/Pages/Page.php b/tests/Browser/Pages/Page.php
new file mode 100644
index 00000000..f8d76222
--- /dev/null
+++ b/tests/Browser/Pages/Page.php
@@ -0,0 +1,20 @@
+ '#selector',
+ ];
+ }
+}
diff --git a/tests/Browser/screenshots/.gitignore b/tests/Browser/screenshots/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/tests/Browser/screenshots/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/tests/ContactsTest.php b/tests/ContactsTest.php
deleted file mode 100644
index 6dddbfae..00000000
--- a/tests/ContactsTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test the `/contacts` page and see if response is OK.
- *
- * @return void
- */
- public function testContactsPage()
- {
- $this->visit($this->appurl . '/contacts')
- ->assertResponseOK();
- }
-
- /**
- * Test an individual contact page with default profile image.
- *
- * @return void
- */
- public function testContactPageWithDefaultPic()
- {
- $this->visit($this->appurl . '/contacts/tantek')
- ->see('
');
- }
-
- /**
- * Test an individual contact page with a specific profile image.
- *
- * @return void
- */
- public function testContactPageWithSpecificPic()
- {
- $this->visit($this->appurl . '/contacts/aaron')
- ->see('
');
- }
-}
diff --git a/tests/BrowserKitTest.php b/tests/CreatesApplication.php
similarity index 56%
rename from tests/BrowserKitTest.php
rename to tests/CreatesApplication.php
index a2429b4f..a2e89522 100644
--- a/tests/BrowserKitTest.php
+++ b/tests/CreatesApplication.php
@@ -1,17 +1,11 @@
make(Kernel::class)->bootstrap();
-
return $app;
}
}
diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php
new file mode 100644
index 00000000..6b71b600
--- /dev/null
+++ b/tests/DuskTestCase.php
@@ -0,0 +1,35 @@
+get('/');
+ $response->assertStatus(200);
+ }
+}
diff --git a/tests/IndieAuthTest.php b/tests/IndieAuthTest.php
deleted file mode 100644
index 97fdadf7..00000000
--- a/tests/IndieAuthTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test the getAuthorizationEndpoint calls the correct service methods,
- * though these methods are actually mocked.
- *
- * @return void
- */
- public function testIndieAuthServiceDiscoversEndpoint()
- {
- $service = new \App\Services\IndieAuthService();
- $client = new \IndieAuth\Client();
- $result = $service->getAuthorizationEndpoint($this->appurl, $client);
- $this->assertSame('https://indieauth.com/auth', $result);
- }
-
- /**
- * Test that the Service build the correct redirect URL.
- *
- * @return void
- */
- public function testIndieAuthServiceBuildRedirectURL()
- {
- $client = new \IndieAuth\Client();
- $service = new \App\Services\IndieAuthService();
- $result = $service->buildAuthorizationURL(
- 'https://indieauth.com/auth',
- $this->appurl,
- $client
- );
- $this->assertSame(
- 'https://indieauth.com/auth?me=',
- substr($result, 0, 30)
- );
- }
-
- /**
- * Test the `start` method redirects to the client on error.
- *
- * @return void
- */
- public function testIndieAuthControllerBeginAuthRedirectsToClientOnFail()
- {
- $response = $this->call('GET', $this->appurl . '/indieauth/start', ['me' => 'http://example.org']);
- $this->assertSame($this->appurl . '/micropub/create', $response->headers->get('Location'));
- }
-
- /**
- * Now we test the `start` method as a whole.
- *
- * @return void
- */
- public function testIndieAuthControllerBeginAuthRedirectsToEndpoint()
- {
- $response = $this->call('GET', $this->appurl . '/indieauth/start', ['me' => $this->appurl]);
- $this->assertSame(
- 'https://indieauth.com/auth?me=',
- substr($response->headers->get('Location'), 0, 30)
- );
- $response = null;
- }
-}
diff --git a/tests/MicropubClientTest.php b/tests/MicropubClientTest.php
deleted file mode 100644
index 67299155..00000000
--- a/tests/MicropubClientTest.php
+++ /dev/null
@@ -1,69 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test the client gets shown for an unauthorised request.
- *
- * @return void
- */
- public function testClientPageUnauthorised()
- {
- $this->visit($this->appurl . '/micropub/create')
- ->see('IndieAuth');
- }
-
- public function testClientPageRecentAuth()
- {
- $this->visit($this->appurl . '/micropub/create')
- ->see($this->appurl);
- }
-
- public function testClientCreatesNewNoteWithTag()
- {
- //in this test, the syndication targets are blank
- $faker = \Faker\Factory::create();
- $note = 'Fake note from #PHPUnit: ' . $faker->text;
- $this->visit($this->appurl . '/micropub/create')
- ->type($note, 'content')
- ->press('Submit');
- $this->seeInDatabase('notes', ['note' => $note]);
- $this->visit($this->appurl . '/notes/tagged/PHPUnit')
- ->see('PHPUnit');
- //my client has made a request to my endpoint, which then adds
- //to the db, so database transaction don’t work
- //so lets manually delete the new entry
- //first, if we are using algolia, we need to delete it
- if (env('SCOUT_DRIVER') == 'algolia') {
- //we need to allow the index to update in order to query it
- sleep(2);
- $client = new \AlgoliaSearch\Client(env('ALGOLIA_APP_ID'), env('ALGOLIA_SECRET'));
- $index = $client->initIndex('notes');
- //here we query for the new note and tell algolia too delete it
- $res = $index->deleteByQuery('Fake note from');
- if ($res == 0) {
- //somehow the new not didn’t get deleted
- $this->fail('Didn’t delete the note from the index');
- }
- }
- $newNote = \App\Note::where('note', $note)->first();
- $newNote->forceDelete();
- }
-}
diff --git a/tests/MicropubTest.php b/tests/MicropubTest.php
deleted file mode 100644
index de9e3f7f..00000000
--- a/tests/MicropubTest.php
+++ /dev/null
@@ -1,271 +0,0 @@
-appurl = config('app.url');
- }
-
- public function testMicropubRequestWithoutToken()
- {
- $this->call('GET', $this->appurl . '/api/post');
- $this->assertResponseStatus(400);
- $this->seeJson(['error_description' => 'No token provided with request']);
- }
-
- public function testMicropubRequestWithoutValidToken()
- {
- $this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer abc123']);
- $this->assertResponseStatus(400);
- $this->seeJson(['error_description' => 'The provided token did not pass validation']);
- }
-
- public function testMicropubRequestWithValidToken()
- {
- $this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->seeJson(['response' => 'token']);
- }
-
- public function testMicropubRequestForSyndication()
- {
- $this->call('GET', $this->appurl . '/api/post', ['q' => 'syndicate-to'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->seeJson(['uid' => 'https://twitter.com/jonnybarnes']);
- }
-
- public function testMicropubRequestForNearbyPlacesThatExist()
- {
- $this->call('GET', $this->appurl . '/api/post', ['q' => 'geo:53.5,-2.38'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->see('the-bridgewater-pub');
- }
-
- public function testMicropubRequestForNearbyPlacesThatExistWithUncertaintyParameter()
- {
- $this->call('GET', $this->appurl . '/api/post', ['q' => 'geo:53.5,-2.38;u=35'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->see('the-bridgewater-pub');
- }
-
- public function testMicropubRequestForNearbyPlacesThatDoNotExist()
- {
- $this->call('GET', $this->appurl . '/api/post', ['q' => 'geo:1.23,4.56'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->see('[]');
- }
-
- public function testMicropubRequestForConfig()
- {
- $this->call('GET', $this->appurl . '/api/post', ['q' => 'config'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
- $this->seeJson(['uid' => 'https://twitter.com/jonnybarnes']);
- }
-
- public function testMicropubRequestCreateNewNote()
- {
- $faker = \Faker\Factory::create();
- $note = $faker->text;
- $this->call(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'h' => 'entry',
- 'content' => $note
- ],
- [],
- [],
- ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
- );
- $this->seeInDatabase('notes', ['note' => $note]);
- }
-
- public function testMicropubRequestCreateNewPlace()
- {
- $this->call(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'h' => 'card',
- 'name' => 'The Barton Arms',
- 'geo' => 'geo:53.4974,-2.3768'
- ],
- [],
- [],
- ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
- );
- $this->seeInDatabase('places', ['slug' => 'the-barton-arms']);
- }
-
- public function testMicropubJSONRequestCreateNewNote()
- {
- $faker = \Faker\Factory::create();
- $note = $faker->text;
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-entry'],
- 'properties' => [
- 'content' => [$note],
- ],
- ],
- ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
- )->seeJson([
- 'response' => 'created'
- ])->assertResponseStatus(201);
- }
-
- public function testMicropubJSONRequestCreateNewNoteWithoutToken()
- {
- $faker = \Faker\Factory::create();
- $note = $faker->text;
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-entry'],
- 'properties' => [
- 'content' => [$note],
- ],
- ]
- )->seeJson([
- 'response' => 'error',
- 'error' => 'no_token'
- ])->assertResponseStatus(400);
- }
-
- public function testMicropubJSONRequestCreateNewNoteWithInvalidToken()
- {
- $faker = \Faker\Factory::create();
- $note = $faker->text;
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-entry'],
- 'properties' => [
- 'content' => [$note],
- ],
- ],
- ['HTTP_Authorization' => 'Bearer ' . $this->getInvalidToken()]
- )->seeJson([
- 'response' => 'error',
- 'error' => 'invalid_token'
- ]);
- }
-
- public function testMicropubJSONRequestCreateNewPlace()
- {
- $faker = \Faker\Factory::create();
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-card'],
- 'properties' => [
- 'name' => $faker->name,
- 'geo' => 'geo:' . $faker->latitude . ',' . $faker->longitude
- ],
- ],
- ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
- )->seeJson([
- 'response' => 'created'
- ])->assertResponseStatus(201);
- }
-
- public function testMicropubJSONRequestCreateNewPlaceWithoutToken()
- {
- $faker = \Faker\Factory::create();
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-entry'],
- 'properties' => [
- 'name' => $faker->name,
- 'geo' => 'geo:' . $faker->latitude . ',' . $faker->longitude
- ],
- ]
- )->seeJson([
- 'response' => 'error',
- 'error' => 'no_token'
- ])->assertResponseStatus(400);
- }
-
- public function testMicropubJSONRequestCreateNewPlaceWithInvalidToken()
- {
- $faker = \Faker\Factory::create();
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-entry'],
- 'properties' => [
- 'name' => $faker->name,
- 'geo' => 'geo:' . $faker->latitude . ',' . $faker->longitude
- ],
- ],
- ['HTTP_Authorization' => 'Bearer ' . $this->getInvalidToken()]
- )->seeJson([
- 'response' => 'error',
- 'error' => 'invalid_token'
- ]);
- }
-
- public function testMicropubJSONRequestCreateNewPlaceWithUncertaintyParam()
- {
- $faker = \Faker\Factory::create();
- $this->json(
- 'POST',
- $this->appurl . '/api/post',
- [
- 'type' => ['h-card'],
- 'properties' => [
- 'name' => $faker->name,
- 'geo' => 'geo:' . $faker->latitude . ',' . $faker->longitude . ';u=35'
- ],
- ],
- ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
- )->seeJson([
- 'response' => 'created'
- ])->assertResponseStatus(201);
- }
-
- private function getToken()
- {
- $signer = new Sha256();
- $token = (new Builder())
- ->set('client_id', 'https://quill.p3k.io')
- ->set('me', 'https://jonnybarnes.localhost')
- ->set('scope', 'post')
- ->set('issued_at', time())
- ->sign($signer, env('APP_KEY'))
- ->getToken();
-
- return $token;
- }
-
- private function getInvalidToken()
- {
- $signer = new Sha256();
- $token = (new Builder())
- ->set('client_id', 'https://quill.p3k.io')
- ->set('me', 'https://jonnybarnes.localhost')
- ->set('scope', 'view')
- ->set('issued_at', time())
- ->sign($signer, env('APP_KEY'))
- ->getToken();
-
- return $token;
- }
-}
diff --git a/tests/NotesAdminTest.php b/tests/NotesAdminTest.php
deleted file mode 100644
index be476736..00000000
--- a/tests/NotesAdminTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-appurl = config('app.url');
- $this->notesAdminController = new \App\Http\Controllers\NotesAdminController();
- }
-
- public function testCreatedNoteDispatchesSendWebmentionsJob()
- {
- $this->expectsJobs(\App\Jobs\SendWebMentions::class);
-
- $this->withSession(['loggedin' => true])
- ->visit($this->appurl . '/admin/note/new')
- ->type('Mentioning', 'content')
- ->press('Submit');
- }
-}
diff --git a/tests/NotesTest.php b/tests/NotesTest.php
deleted file mode 100644
index 8112b32f..00000000
--- a/tests/NotesTest.php
+++ /dev/null
@@ -1,182 +0,0 @@
-appurl = config('app.url');
- $this->notesController = new \App\Http\Controllers\NotesController();
- }
-
- /**
- * Test the `/notes` page returns 200, this should
- * mean the database is being hit.
- *
- * @return void
- */
- public function testNotesPage()
- {
- $this->visit($this->appurl . '/notes')
- ->assertResponseOk();
- }
-
- /**
- * Test a specific note so that `singleNote()` get called.
- *
- * @return void
- */
- public function testSpecificNote()
- {
- $this->visit($this->appurl . '/notes/B')
- ->see('#beer');
- }
-
- /**
- * Test that `/note/{decID}` redirects to `/notes/{nb60id}`.
- *
- * @return void
- */
- public function testDecIDRedirect()
- {
- $this->get($this->appurl . '/note/11')
- ->assertRedirectedTo(config('app.url') . '/notes/B');
- }
-
- /**
- * Visit the tagged page and see text from the note.
- *
- * @return void
- */
- public function testTaggedNotesPage()
- {
- $this->visit($this->appurl . '/notes/tagged/beer')
- ->see('at the local.');
- }
-
- /**
- * Look for a default image in the contact’s h-card.
- *
- * @return void
- */
- public function testDefaultImageUsed()
- {
- $this->visit($this->appurl . '/notes/C')
- ->see('
');
- }
-
- /**
- * Look for a specific profile image in the contact’s h-card.
- *
- * @return void
- */
- public function testProfileImageUsed()
- {
- $this->visit($this->appurl . '/notes/D')
- ->see('
');
- }
-
- /**
- * Look for twitter URL when there’s no associated contact.
- *
- * @return void
- */
- public function testTwitterLinkCreatedWhenNoContactFound()
- {
- $this->visit($this->appurl . '/notes/E')
- ->see('@bob');
- }
-
- /**
- * Test hashtag linking.
- *
- * @return void
- */
- public function testHashtags()
- {
- $this->visit($this->appurl . '/notes/B')
- ->see('#beer');
- }
-
- /**
- * Look for the client name after the note.
- *
- * @return void
- */
- public function testClientNameDisplayed()
- {
- $this->visit($this->appurl . '/notes/D')
- ->see('JBL5');
- }
-
- /**
- * Look for the client URL after the note.
- *
- * @return void
- */
- public function testClientURLDisplayed()
- {
- $this->visit($this->appurl . '/notes/E')
- ->see('quill.p3k.io');
- }
-
- /**
- * Test a correct profile link is formed from a generic URL.
- *
- * @return void
- */
- public function testCreatePhotoLinkWithNonCachedImage()
- {
- $homepage = 'https://example.org/profile.png';
- $expected = 'https://example.org/profile.png';
- $this->assertEquals($expected, $this->notesController->createPhotoLink($homepage));
- }
-
- /**
- * Test a correct profile link is formed from a generic URL.
- *
- * @return void
- */
- public function testCreatePhotoLinkWithCachedImage()
- {
- $homepage = 'https://aaronparecki.com/profile.png';
- $expected = '/assets/profile-images/aaronparecki.com/image';
- $this->assertEquals($expected, $this->notesController->createPhotoLink($homepage));
- }
-
- /**
- * Test a correct profile link is formed from a twitter URL.
- *
- * @return void
- */
- public function testCreatePhotoLinkWithTwimgProfileImageURL()
- {
- $twitterProfileImage = 'http://pbs.twimg.com/1234';
- $expected = 'https://pbs.twimg.com/1234';
- $this->assertEquals($expected, $this->notesController->createPhotoLink($twitterProfileImage));
- }
-
- /**
- * Test `null` is returned for a twitter profile.
- *
- * @return void
- */
- public function testCreatePhotoLinkWithCachedTwitterURL()
- {
- $twitterURL = 'https://twitter.com/example';
- $expected = 'https://pbs.twimg.com/static_profile_link.jpg';
- Cache::put($twitterURL, $expected, 1);
- $this->assertEquals($expected, $this->notesController->createPhotoLink($twitterURL));
- }
-}
diff --git a/tests/PlacesTest.php b/tests/PlacesTest.php
deleted file mode 100644
index 7af4c6ac..00000000
--- a/tests/PlacesTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test the `/places` page for OK response.
- *
- * @return void
- */
- public function testPlacesPage()
- {
- $this->visit($this->appurl . '/places')
- ->assertResponseOK();
- }
-
- /**
- * Test a specific place.
- *
- * @return void
- */
- public function testSinglePlace()
- {
- $this->visit($this->appurl . '/places/the-bridgewater-pub')
- ->see('The Bridgewater Pub');
- }
-
- /**
- * Test the nearby method returns a collection.
- *
- * @return void
- */
- public function testNearbyMethod()
- {
- $nearby = \App\Place::near(53.5, -2.38, 1000);
- $this->assertEquals('the-bridgewater-pub', $nearby[0]->slug);
- }
-}
diff --git a/tests/TestCase.php b/tests/TestCase.php
index 8208edca..2932d4a6 100644
--- a/tests/TestCase.php
+++ b/tests/TestCase.php
@@ -1,25 +1,10 @@
make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
-
- return $app;
- }
+ use CreatesApplication;
}
diff --git a/tests/TokenServiceTest.php b/tests/TokenServiceTest.php
deleted file mode 100644
index 8ca43fd7..00000000
--- a/tests/TokenServiceTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-appurl = config('app.url');
- $this->tokenService = new \App\Services\TokenService();
- }
-
- /**
- * Given the token is dependent on a random nonce, the time of creation and
- * the APP_KEY, to test, we shall create a token, and then verify it.
- *
- * @return void
- */
- public function testTokenCreationAndValidation()
- {
- $data = [
- 'me' => 'https://example.org',
- 'client_id' => 'https://quill.p3k.io',
- 'scope' => 'post'
- ];
- $token = $this->tokenService->getNewToken($data);
- $valid = $this->tokenService->validateToken($token);
- $validData = [
- 'me' => $valid->getClaim('me'),
- 'client_id' => $valid->getClaim('client_id'),
- 'scope' => $valid->getClaim('scope')
- ];
- $this->assertSame($data, $validData);
- }
-}
diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php
new file mode 100644
index 00000000..5663bb49
--- /dev/null
+++ b/tests/Unit/ExampleTest.php
@@ -0,0 +1,20 @@
+assertTrue(true);
+ }
+}
diff --git a/tests/WebMentionsTest.php b/tests/WebMentionsTest.php
deleted file mode 100644
index e296f96e..00000000
--- a/tests/WebMentionsTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
-appurl = config('app.url');
- }
-
- /**
- * Test webmentions without source and target are rejected.
- *
- * @return void
- */
- public function testWebmentionsWithoutSourceAndTargetAreRejected()
- {
- $this->call('POST', $this->appurl . '/webmention', ['source' => 'https://example.org/post/123']);
- $this->assertResponseStatus(400)
- ->see('You need both the target and source parameters');
- }
-
- /**
- * Test invalid target gets a 400 response.
- *
- * @return void
- */
- public function testInvalidTargetReturns400Response()
- {
- $this->call('POST', $this->appurl . '/webmention', [
- 'source' => 'https://example.org/post/123',
- 'target' => $this->appurl . '/invalid/target'
- ]);
- $this->assertResponseStatus(400)
- ->see('Invalid request');
- }
-
- /**
- * Test blog target gets a 501 response.
- *
- * @return void
- */
- public function testBlogpostTargetReturns501Response()
- {
- $this->call('POST', $this->appurl . '/webmention', [
- 'source' => 'https://example.org/post/123',
- 'target' => $this->appurl . '/blog/target'
- ]);
- $this->assertResponseStatus(501)
- ->see('I don’t accept webmentions for blog posts yet.');
- }
-
- /**
- * Test that a non-existant note gives a 400 response.
- *
- * @return void
- */
- public function testNonexistantNoteReturns400Response()
- {
- $this->call('POST', $this->appurl . '/webmention', [
- 'source' => 'https://example.org/post/123',
- 'target' => $this->appurl . '/notes/ZZZZZ'
- ]);
- $this->assertResponseStatus(400)
- ->see('This note doesn’t exist.');
- }
-
- /**
- * Test a legit webmention triggers the ProcessWebMention job.
- *
- * @return void
- */
- public function testLegitimateWebmnetionTriggersProcessWebMentionJob()
- {
- $this->expectsJobs(\App\Jobs\ProcessWebMention::class);
- $this->call('POST', $this->appurl . '/webmention', [
- 'source' => 'https://example.org/post/123',
- 'target' => $this->appurl . '/notes/B'
- ]);
- $this->assertResponseStatus(202)
- ->see('Webmention received, it will be processed shortly');
- }
-}
diff --git a/tests/aaron.png b/tests/aaron.png
deleted file mode 100644
index 28923438..00000000
Binary files a/tests/aaron.png and /dev/null differ