Browse Source

Added Login and Logout with testing

Login using username
Removed Forgot and reset password feature
Added BrowserKitTesting package
Change App Name config to "Grosir Obat"
Update database config charset and collation to "utf8"
pull/1/head
Nafies Luthfi 9 years ago
parent
commit
03d02832af
  1. 32
      app/Http/Controllers/Auth/ForgotPasswordController.php
  2. 5
      app/Http/Controllers/Auth/LoginController.php
  3. 39
      app/Http/Controllers/Auth/ResetPasswordController.php
  4. 28
      app/Http/Controllers/HomeController.php
  5. 5
      app/User.php
  6. 0
      artisan
  7. 1
      composer.json
  8. 105
      composer.lock
  9. 2
      config/app.php
  10. 4
      config/database.php
  11. 5
      database/factories/ModelFactory.php
  12. 2
      database/migrations/2014_10_12_000000_create_users_table.php
  13. 32
      database/migrations/2014_10_12_100000_create_password_resets_table.php
  14. 2
      database/seeds/DatabaseSeeder.php
  15. 20
      database/seeds/UsersTableSeeder.php
  16. 2
      phpunit.xml
  17. 72
      resources/views/auth/login.blade.php
  18. 17
      resources/views/home.blade.php
  19. 85
      resources/views/layouts/app.blade.php
  20. 6
      routes/web.php
  21. 0
      storage/app/.gitignore
  22. 0
      storage/app/public/.gitignore
  23. 0
      storage/framework/.gitignore
  24. 0
      storage/framework/cache/.gitignore
  25. 0
      storage/framework/sessions/.gitignore
  26. 0
      storage/framework/testing/.gitignore
  27. 0
      storage/framework/views/.gitignore
  28. 0
      storage/logs/.gitignore
  29. 15
      tests/BrowserKitTestCase.php
  30. 54
      tests/Feature/Auth/UserLoginTest.php
  31. 23
      tests/Feature/ExampleTest.php

32
app/Http/Controllers/Auth/ForgotPasswordController.php

@ -1,32 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}

5
app/Http/Controllers/Auth/LoginController.php

@ -36,4 +36,9 @@ class LoginController extends Controller
{ {
$this->middleware('guest', ['except' => 'logout']); $this->middleware('guest', ['except' => 'logout']);
} }
public function username()
{
return 'username';
}
} }

39
app/Http/Controllers/Auth/ResetPasswordController.php

@ -1,39 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}

28
app/Http/Controllers/HomeController.php

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}

5
app/User.php

@ -26,4 +26,9 @@ class User extends Authenticatable
protected $hidden = [ protected $hidden = [
'password', 'remember_token', 'password', 'remember_token',
]; ];
public function setPasswordAttribute($password)
{
$this->attributes['password'] = bcrypt($password);
}
} }

0
artisan

1
composer.json

@ -6,6 +6,7 @@
"type": "project", "type": "project",
"require": { "require": {
"php": ">=5.6.4", "php": ">=5.6.4",
"laravel/browser-kit-testing": "^1.0",
"laravel/framework": "5.4.*", "laravel/framework": "5.4.*",
"laravel/tinker": "~1.0" "laravel/tinker": "~1.0"
}, },

105
composer.lock

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "96098e473b028cdb2529580554a1ae3e",
"content-hash": "84e5d69e0c52b9e0be3312d687b8482e",
"packages": [ "packages": [
{ {
"name": "dnoegel/php-xdg-base-dir", "name": "dnoegel/php-xdg-base-dir",
@ -236,6 +236,53 @@
"time": "2015-04-20T18:58:01+00:00" "time": "2015-04-20T18:58:01+00:00"
}, },
{ {
"name": "laravel/browser-kit-testing",
"version": "v1.0.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/browser-kit-testing.git",
"reference": "0adfb725147815bff5516d157577f375a6e66ebd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/browser-kit-testing/zipball/0adfb725147815bff5516d157577f375a6e66ebd",
"reference": "0adfb725147815bff5516d157577f375a6e66ebd",
"shasum": ""
},
"require": {
"php": ">=5.5.9",
"symfony/css-selector": "~3.1",
"symfony/dom-crawler": "~3.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Laravel\\BrowserKitTesting\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"description": "Provides backwards compatibility for BrowserKit testing in Laravel 5.4.",
"keywords": [
"laravel",
"testing"
],
"time": "2017-02-08T22:32:37+00:00"
},
{
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.4.17", "version": "v5.4.17",
"source": { "source": {
@ -1209,6 +1256,62 @@
"time": "2017-03-28T21:38:24+00:00" "time": "2017-03-28T21:38:24+00:00"
}, },
{ {
"name": "symfony/dom-crawler",
"version": "v3.2.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
"reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/403944e294cf4ceb3b8447f54cbad88ea7b99cee",
"reference": "403944e294cf4ceb3b8447f54cbad88ea7b99cee",
"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.2-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-02-21T09:12:04+00:00"
},
{
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v3.2.7", "version": "v3.2.7",
"source": { "source": {

2
config/app.php

@ -12,7 +12,7 @@ return [
| any other location as required by the application or its packages. | any other location as required by the application or its packages.
*/ */
'name' => env('APP_NAME', 'Laravel'),
'name' => 'Grosir Obat',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

4
config/database.php

@ -47,8 +47,8 @@ return [
'username' => env('DB_USERNAME', 'forge'), 'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''), 'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''), 'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '', 'prefix' => '',
'strict' => true, 'strict' => true,
'engine' => null, 'engine' => null,

5
database/factories/ModelFactory.php

@ -13,12 +13,11 @@
/** @var \Illuminate\Database\Eloquent\Factory $factory */ /** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\User::class, function (Faker\Generator $faker) { $factory->define(App\User::class, function (Faker\Generator $faker) {
static $password;
return [ return [
'name' => $faker->name, 'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'username' => $faker->unique()->username,
'password' => 'secret',
'remember_token' => str_random(10), 'remember_token' => str_random(10),
]; ];
}); });

2
database/migrations/2014_10_12_000000_create_users_table.php

@ -16,7 +16,7 @@ class CreateUsersTable extends Migration
Schema::create('users', function (Blueprint $table) { Schema::create('users', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->string('name'); $table->string('name');
$table->string('email')->unique();
$table->string('username')->unique();
$table->string('password'); $table->string('password');
$table->rememberToken(); $table->rememberToken();
$table->timestamps(); $table->timestamps();

32
database/migrations/2014_10_12_100000_create_password_resets_table.php

@ -1,32 +0,0 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePasswordResetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets');
}
}

2
database/seeds/DatabaseSeeder.php

@ -11,6 +11,6 @@ class DatabaseSeeder extends Seeder
*/ */
public function run() public function run()
{ {
// $this->call(UsersTableSeeder::class);
$this->call(UsersTableSeeder::class);
} }
} }

20
database/seeds/UsersTableSeeder.php

@ -0,0 +1,20 @@
<?php
use App\User;
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(User::class)->create([
'name' => 'Administrator',
'username' => 'admin',
]);
}
}

2
phpunit.xml

@ -27,5 +27,7 @@
<env name="CACHE_DRIVER" value="array"/> <env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/> <env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php> </php>
</phpunit> </phpunit>

72
resources/views/auth/login.blade.php

@ -0,0 +1,72 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Login</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ route('login') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('username') ? ' has-error' : '' }}">
<label for="username" class="col-md-4 control-label">Username</label>
<div class="col-md-6">
<input id="username" type="text" class="form-control" name="username" value="{{ old('username') }}" required autofocus>
@if ($errors->has('username'))
<span class="help-block">
<strong>{{ $errors->first('username') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="password" class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember" {{ old('remember') ? 'checked' : '' }}> Remember Me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Login
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@endsection

17
resources/views/home.blade.php

@ -0,0 +1,17 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Dashboard</div>
<div class="panel-body">
You are logged in!
</div>
</div>
</div>
</div>
</div>
@endsection

85
resources/views/layouts/app.blade.php

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="{{ config('app.locale') }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ config('app.name', 'Laravel') }}</title>
<!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<!-- Scripts -->
<script>
window.Laravel = {!! json_encode([
'csrfToken' => csrf_token(),
]) !!};
</script>
</head>
<body>
<div id="app">
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Collapsed Hamburger -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#app-navbar-collapse">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Branding Image -->
<a class="navbar-brand" href="{{ url('/') }}">
{{ config('app.name', 'Laravel') }}
</a>
</div>
<div class="collapse navbar-collapse" id="app-navbar-collapse">
<!-- Left Side Of Navbar -->
<ul class="nav navbar-nav">
&nbsp;
</ul>
<!-- Right Side Of Navbar -->
<ul class="nav navbar-nav navbar-right">
<!-- Authentication Links -->
@if (Auth::check())
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
Logout
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
<button type="submit" style="display: none;" id="logout-button" >Logout</button>
</form>
</li>
</ul>
</li>
@endif
</ul>
</div>
</div>
</nav>
@yield('content')
</div>
<!-- Scripts -->
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>

6
routes/web.php

@ -12,5 +12,9 @@
*/ */
Route::get('/', function () { Route::get('/', function () {
return view('welcome');
return redirect()->route('login');
}); });
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');

0
storage/app/.gitignore

0
storage/app/public/.gitignore

0
storage/framework/.gitignore

0
storage/framework/cache/.gitignore

0
storage/framework/sessions/.gitignore

0
storage/framework/testing/.gitignore

0
storage/framework/views/.gitignore

0
storage/logs/.gitignore

15
tests/BrowserKitTestCase.php

@ -0,0 +1,15 @@
<?php
namespace Tests;
use App\Entities\Customers\Customer;
use App\Entities\Invoices\Invoice;
use App\Entities\Receipts\Receipt;
use App\Entities\Users\User;
abstract class BrowserKitTestCase extends \Laravel\BrowserKitTesting\TestCase
{
use CreatesApplication;
protected $baseUrl = 'http://localhost';
}

54
tests/Feature/Auth/UserLoginTest.php

@ -0,0 +1,54 @@
<?php
namespace Tests\Feature\Auth;
use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\BrowserKitTestCase;
class UserLoginTest extends BrowserKitTestCase
{
use DatabaseMigrations;
/** @test */
public function it_validates_the_login_form()
{
$this->visit(route('login'))
->type('foobar', 'username')
->type('secret', 'password')
->press('Login')
->dontSeeIsAuthenticated()
->seePageIs(route('login'));
$this->see(trans('auth.failed'));
}
/** @test */
public function user_can_login()
{
$user = factory(User::class)->create(['password' => '123456']);
$this->visit(route('login'));
$this->type($user->username,'username');
$this->type('123456','password');
$this->press('Login');
$this->seePageIs(route('home'));
$this->see($user->name);
// $this->dump();
$this->press('logout-button');
$this->seePageIs(route('login'));
}
/** @test */
public function it_can_logout_of_the_application()
{
$user = factory(User::class)->create(['password' => '123456']);
$this->actingAs($user)
->visit(route('home'))
->press('logout-button')
->seePageis(route('login'))
->dontSeeIsAuthenticated();
}
}

23
tests/Feature/ExampleTest.php

@ -1,23 +0,0 @@
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Loading…
Cancel
Save