diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
new file mode 100644
index 0000000..a3af7dd
--- /dev/null
+++ b/app/Http/Controllers/HomeController.php
@@ -0,0 +1,28 @@
+middleware('auth');
+ }
+
+ /**
+ * Show the application dashboard.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function index()
+ {
+ return view('home');
+ }
+}
diff --git a/codeception.yml b/codeception.yml
new file mode 100644
index 0000000..4d7027a
--- /dev/null
+++ b/codeception.yml
@@ -0,0 +1,12 @@
+paths:
+ tests: tests
+ output: tests/_output
+ data: tests/_data
+ support: tests/_support
+ envs: tests/_envs
+actor_suffix: Tester
+extensions:
+ enabled:
+ - Codeception\Extension\RunFailed
+settings:
+ bootstrap: _bootstrap.php
diff --git a/composer.json b/composer.json
index 08d886c..35ed8db 100644
--- a/composer.json
+++ b/composer.json
@@ -20,6 +20,7 @@
"codeception/codeception": "^2.4",
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
+ "guzzlehttp/guzzle": "^6.3",
"mockery/mockery": "~1.0",
"phpunit/phpunit": "~6.0",
"symfony/thanks": "^1.0"
diff --git a/composer.lock b/composer.lock
index c555266..5ba3ba7 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "0cbfd32cc57280040ed24ff2f9add7a6",
+ "content-hash": "cddd88b2bc6fcfeb60c6125a7227f26e",
"packages": [
{
"name": "barryvdh/laravel-snappy",
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
index e119db6..2399bf1 100644
--- a/database/seeds/DatabaseSeeder.php
+++ b/database/seeds/DatabaseSeeder.php
@@ -11,6 +11,6 @@ class DatabaseSeeder extends Seeder
*/
public function run()
{
- // $this->call(UsersTableSeeder::class);
+ $this->call(UsersTableSeeder::class);
}
}
diff --git a/database/seeds/UsersTableSeeder.php b/database/seeds/UsersTableSeeder.php
new file mode 100644
index 0000000..8d503f7
--- /dev/null
+++ b/database/seeds/UsersTableSeeder.php
@@ -0,0 +1,18 @@
+create([
+ 'email' => 'admin@laraland.test'
+ ]);
+ }
+}
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
new file mode 100644
index 0000000..07924ce
--- /dev/null
+++ b/resources/views/auth/login.blade.php
@@ -0,0 +1,69 @@
+@extends('layouts.app')
+
+@section('content')
+
- Laravel
+ {{config('app.name', 'Laravel')}}
diff --git a/routes/web.php b/routes/web.php
index 810aa34..12fc04c 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -14,3 +14,7 @@
Route::get('/', function () {
return view('welcome');
});
+
+Auth::routes();
+
+Route::get('/home', 'HomeController@index')->name('home');
diff --git a/tests/_data/.gitkeep b/tests/_data/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/_data/db_laraland.sql b/tests/_data/db_laraland.sql
new file mode 100644
index 0000000..257121b
--- /dev/null
+++ b/tests/_data/db_laraland.sql
@@ -0,0 +1,47 @@
+-- Adminer 4.3.0 MySQL dump
+
+SET NAMES utf8;
+SET time_zone = '+00:00';
+SET foreign_key_checks = 0;
+SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
+
+SET NAMES utf8mb4;
+
+DROP TABLE IF EXISTS `migrations`;
+CREATE TABLE `migrations` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `migration` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `batch` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES
+(59, '2014_10_12_000000_create_users_table', 1),
+(60, '2014_10_12_100000_create_password_resets_table', 1);
+
+DROP TABLE IF EXISTS `password_resets`;
+CREATE TABLE `password_resets` (
+ `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `created_at` timestamp NULL DEFAULT NULL,
+ KEY `password_resets_email_index` (`email`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
+DROP TABLE IF EXISTS `users`;
+CREATE TABLE `users` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `created_at` timestamp NULL DEFAULT NULL,
+ `updated_at` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `users_email_unique` (`email`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+INSERT INTO `users` (`id`, `name`, `email`, `password`, `remember_token`, `created_at`, `updated_at`) VALUES
+(1, 'Dr. Ena Steuber III', 'admin@laraland.test', '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', 'x4Jo6Fc40Y', '2018-07-19 05:02:22', '2018-07-19 05:02:22');
+
+-- 2018-07-19 05:02:32
diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/tests/_output/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file
diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php
new file mode 100644
index 0000000..8322665
--- /dev/null
+++ b/tests/_support/AcceptanceTester.php
@@ -0,0 +1,151 @@
+seeInDatabase('users', ['email' => 'admin@laraland.test']);
+ }
+
+ /**
+ * @When Saya mengirim form berisi email saya
+ */
+ public function sayaMengirimFormBerisiEmailSaya()
+ {
+ $I = $this;
+
+ $I->amOnPage('/password/reset');
+ $I->fillField('email', 'admin@laraland.test');
+ $I->click('button[type=submit]');
+ }
+
+ /**
+ * @Then Saya melihat bahwa sebuah email telah dikirim dari sistem
+ */
+ public function sayaMelihatBahwaSebuahEmailTelahDikirimDariSistem()
+ {
+ $I = $this;
+
+ $I->see('We have e-mailed your password reset link!');
+ }
+
+ /**
+ * @Given Saya membuka link pada email dari sistem
+ */
+ public function sayaMembukaLinkPadaEmailDariSistem()
+ {
+ $I = $this;
+
+ $I->requestEmailResetPasswordLink($I);
+
+ $this->mailcatcher = new GuzzleHttp\Client([
+ 'base_uri' => 'http://localhost:8025/api/v1/'
+ ]);
+
+ $this->mail = $this->getLastMessage($this->mailcatcher);
+
+ $pattern = '/\/password\/reset\/[\w=\s]+[^\W]+/';
+
+ foreach($this->mail as $key => $val) {
+ if ($key == 'Content') {
+ foreach($val as $head => $body) {
+ if ($head == 'Body') {
+ preg_match($pattern, $body, $matches);
+ }
+ }
+ }
+ }
+
+ $url = preg_replace('/=\s+/', '', $matches[0]);
+ $url = preg_replace('/\s+[\w\W]+/', '', $url);
+
+ $I->amOnPage($url);
+ }
+
+ /**
+ * @When Saya mengirim form berisi password baru
+ */
+ public function sayaMengirimFormBerisiPasswordBaru()
+ {
+ $I = $this;
+
+ $I->fillField('email', 'admin@laraland.test');
+ $I->fillField('password', 'newsecret');
+ $I->fillField('password_confirmation', 'newsecret');
+ $I->click('button[type=submit]');
+ }
+
+ /**
+ * @Then Saya berhasil signin dengan password baru
+ */
+ public function sayaBerhasilSigninDenganPasswordBaru()
+ {
+ $I = $this;
+
+ $I->seeCurrentUrlEquals('/home');
+ $I->see('Your password has been reset!');
+ }
+
+
+
+ /**
+ * @Given Saya berada di halaman registrasi
+ */
+ public function sayaBeradaDiHalamanRegistrasi()
+ {
+ $I = $this;
+
+ $I->amOnPage('/register');
+ }
+
+ /**
+ * @When Saya mengirim form registrasi
+ */
+ public function sayaMengirimFormRegistrasi()
+ {
+ $I = $this;
+
+ $I->fillField('name', \Faker\Factory::create()->name);
+ $I->fillField('email', 'admin2@laraland.test');
+ $I->fillField('password', 'sosecret');
+ $I->fillField('password_confirmation', 'sosecret');
+ $I->click('button[type=submit]');
+ }
+
+ /**
+ * @Then Saya akan dialihkan ke halaman dashboard
+ */
+ public function sayaAkanDialihkanKeHalamanDashboard()
+ {
+ $I = $this;
+
+ $I->seeCurrentUrlEquals('/home');
+ $I->see('Dashboard');
+ }
+}
diff --git a/tests/_support/FunctionalTester.php b/tests/_support/FunctionalTester.php
new file mode 100644
index 0000000..7e888f8
--- /dev/null
+++ b/tests/_support/FunctionalTester.php
@@ -0,0 +1,26 @@
+delete('messages');
+ }
+
+ public function getLastMessage(\GuzzleHttp\Client $mailcatcher)
+ {
+ $messages = $this->getMessages($mailcatcher);
+ if (empty($messages)) $this->fail('No messages received');
+
+ return reset($messages);
+ }
+
+ public function getMessages(\GuzzleHttp\Client $mailcatcher)
+ {
+ $jsonResponse = $mailcatcher->get('messages');
+
+ return json_decode($jsonResponse->getBody());
+ }
+
+ public function requestEmailResetPasswordLink(\AcceptanceTester $I)
+ {
+ $I->amOnPage('/password/reset');
+ $I->fillField('email', 'admin@laraland.test');
+ $I->click('button[type=submit]');
+ }
+}
diff --git a/tests/_support/Helper/Functional.php b/tests/_support/Helper/Functional.php
new file mode 100644
index 0000000..4183cb0
--- /dev/null
+++ b/tests/_support/Helper/Functional.php
@@ -0,0 +1,10 @@
+create(['email' => 'admin@laraland.test']);
+ }
+
+ public function _after(AcceptanceTester $I)
+ {
+ // Artisan::call('migrate:rollback');
+ }
+
+ // tests
+ public function memintaLinkResetPassword(AcceptanceTester $I)
+ {
+ $I->wantTo('get emailed by system with reset password link inside it');
+
+ $I->amOnPage('/password/reset');
+ $I->fillField('email', 'admin@laraland.test');
+ $I->click('button[type=submit]');
+ $I->see('We have e-mailed your password reset link!');
+ }
+}
diff --git a/tests/acceptance/SigninCest.php b/tests/acceptance/SigninCest.php
new file mode 100644
index 0000000..6123337
--- /dev/null
+++ b/tests/acceptance/SigninCest.php
@@ -0,0 +1,44 @@
+create(['email' => 'admin@laraland.test']);
+ }
+
+ public function _after(AcceptanceTester $I)
+ {
+ // Artisan::call('migrate:rollback');
+ }
+
+ // tests
+ public function signinSuccessful(AcceptanceTester $I)
+ {
+ $I->wantTo('signin with correct credential and should go to dashboard page');
+
+ $I->amOnPage('/login');
+ $I->fillField('email', 'admin@laraland.test');
+ $I->fillField('password', 'secret');
+ $I->click('button[type=submit]');
+
+ $I->see('Dashboard');
+ $I->seeCurrentUrlEquals('/home');
+ }
+
+ public function signinUnsuccessful(AcceptanceTester $I)
+ {
+ $I->wantTo('signin with incorrect credential and should go back to login page');
+
+ $I->amOnPage('/login');
+ $I->fillField('email', 'admin@laraland.test');
+ $I->fillField('password', 'notsecret');
+ $I->click('button[type=submit]');
+
+ $I->see('Login');
+ $I->seeCurrentUrlEquals('/login');
+ }
+}
diff --git a/tests/acceptance/_bootstrap.php b/tests/acceptance/_bootstrap.php
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/tests/acceptance/_bootstrap.php
@@ -0,0 +1 @@
+