Create CI testing
This commit is contained in:
parent
4011b2a82d
commit
292040cef7
41
.env.testing
Normal file
41
.env.testing
Normal file
@ -0,0 +1,41 @@
|
||||
APP_NAME="Clearing Houz"
|
||||
APP_ENV=testing
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
#APP_URL=http://localhost
|
||||
|
||||
LOG_CHANNEL=stderr
|
||||
LOG_LEVEL=info
|
||||
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=database
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=postgres
|
||||
DB_USERNAME=postgres
|
||||
DB_PASSWORD=secret
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=mail.leenooks.vpn
|
||||
MAIL_PORT=25
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_AUTO_EMBED_METHOD=base64
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
@ -10,4 +10,5 @@ cache:
|
||||
- vendor/
|
||||
|
||||
include:
|
||||
- .gitlab-test.yml
|
||||
- .gitlab-docker-x86_64.yml
|
||||
|
40
.gitlab-test.yml
Normal file
40
.gitlab-test.yml
Normal file
@ -0,0 +1,40 @@
|
||||
test:
|
||||
image: ${CI_REGISTRY}/leenooks/php:8.0-fpm-ext-test
|
||||
|
||||
stage: test
|
||||
|
||||
# NOTE: This service is dependant on project file configuration, which is not there if the cache was deleted
|
||||
# resulting in the testing to fail on the first run.
|
||||
services:
|
||||
- name: postgres:13-alpine
|
||||
alias: database
|
||||
|
||||
variables:
|
||||
POSTGRES_PASSWORD: secret
|
||||
|
||||
tags:
|
||||
- php
|
||||
only:
|
||||
- master
|
||||
|
||||
before_script:
|
||||
- mv .env.testing .env
|
||||
|
||||
# Install Composer and project dependencies.
|
||||
- mkdir -p /root/.composer
|
||||
- if [ -n "$GITHUB_TOKEN" ]; then cat $GITHUB_TOKEN |base64 -d > /root/.composer/auth.json ; fi
|
||||
- composer install
|
||||
|
||||
# Generate an application key. Re-cache.
|
||||
- php artisan key:generate
|
||||
- php artisan migrate
|
||||
|
||||
script:
|
||||
# run laravel tests
|
||||
- XDEBUG_MODE=coverage php vendor/bin/phpunit --coverage-text --colors=never
|
||||
|
||||
# run frontend tests
|
||||
# if you have any task for testing frontend
|
||||
# set it in your package.json script
|
||||
# comment this out if you don't have a frontend test
|
||||
# npm test
|
@ -11,4 +11,14 @@ class HomeController extends Controller
|
||||
return view('domain.view')
|
||||
->with('o',$o);
|
||||
}
|
||||
|
||||
/**
|
||||
* System Setup
|
||||
*
|
||||
* @note: Protected by Route
|
||||
*/
|
||||
public function setup()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -2,13 +2,14 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
use App\Traits\ScopeActive;
|
||||
|
||||
class Domain extends Model
|
||||
{
|
||||
use ScopeActive;
|
||||
use HasFactory,ScopeActive;
|
||||
|
||||
/* SCOPES */
|
||||
|
||||
|
@ -5,6 +5,8 @@ namespace App\Providers;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
class AuthServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
@ -25,6 +27,8 @@ class AuthServiceProvider extends ServiceProvider
|
||||
{
|
||||
$this->registerPolicies();
|
||||
|
||||
//
|
||||
Gate::define('admin',function (User $o) {
|
||||
return $o->admin == TRUE;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,9 @@
|
||||
"app/helpers.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"App\\": "app/"
|
||||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
52
database/factories/DomainFactory.php
Normal file
52
database/factories/DomainFactory.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use App\Models\Domain;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class DomainFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The name of the factory's corresponding model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $model = Domain::class;
|
||||
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
'name' => $this->faker->name(),
|
||||
'dnsdomain' => $this->faker->unique()->safeEmail(),
|
||||
'notes' => $this->faker->text(),
|
||||
'homepage' => $this->faker->text(),
|
||||
'active' => FALSE,
|
||||
'public' => FALSE,
|
||||
];
|
||||
}
|
||||
|
||||
public function active()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'active' => TRUE,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function public()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'public' => TRUE,
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
@ -1,24 +1,42 @@
|
||||
<?php
|
||||
|
||||
use Faker\Generator as Faker;
|
||||
namespace Database\Factories;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Model Factories
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This directory should contain each of the model factory definitions for
|
||||
| your application. Factories provide a convenient way to generate new
|
||||
| model instances for testing / seeding your application's database.
|
||||
|
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class UserFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* The name of the factory's corresponding model.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $model = User::class;
|
||||
|
||||
$factory->define(App\User::class, function (Faker $faker) {
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function definition()
|
||||
{
|
||||
return [
|
||||
'name' => $faker->name,
|
||||
'email' => $faker->unique()->safeEmail,
|
||||
'name' => $this->faker->name(),
|
||||
'email' => $this->faker->unique()->safeEmail(),
|
||||
'email_verified_at' => now(),
|
||||
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
|
||||
'remember_token' => str_random(10),
|
||||
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
|
||||
'remember_token' => Str::random(10),
|
||||
];
|
||||
}
|
||||
|
||||
public function admin()
|
||||
{
|
||||
return $this->state(function (array $attributes) {
|
||||
return [
|
||||
'admin' => true,
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
42
database/migrations/2021_06_14_114942_add_admin_to_users.php
Normal file
42
database/migrations/2021_06_14_114942_add_admin_to_users.php
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAdminToUsers extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->boolean('admin')->nullable();
|
||||
});
|
||||
|
||||
Schema::create('domain_user', function (Blueprint $table) {
|
||||
$table->integer('domain_id');
|
||||
$table->foreign('domain_id')->references('id')->on('domains');
|
||||
|
||||
$table->integer('user_id');
|
||||
$table->foreign('user_id')->references('id')->on('users');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('admin');
|
||||
});
|
||||
|
||||
Schema::dropIfExists('domain_user');
|
||||
}
|
||||
}
|
9
resources/views/domain/view.blade.php
Normal file
9
resources/views/domain/view.blade.php
Normal file
@ -0,0 +1,9 @@
|
||||
@extends('layouts.app')
|
||||
@section('htmlheader_title')
|
||||
{{ $o->name }}
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<h1>{{ $o->name }} <small class="push-right">Last Update: {{ $o->updated_at }}</small></h1>
|
||||
<p>{!! \Illuminate\Mail\Markdown::parse($o->homepage) !!}</p>
|
||||
@endsection
|
@ -42,8 +42,10 @@ Route::middleware(['verified'])->group(function () {
|
||||
Route::get('ftn/zone',[ZoneController::class,'home']);
|
||||
Route::match(['get','post'],'ftn/zone/addedit/{o?}',[ZoneController::class,'add_edit'])
|
||||
->where('o','[0-9]+');
|
||||
|
||||
Route::get('ftn/network/{name}',[HomeController::class,'network']);
|
||||
});
|
||||
|
||||
Route::get('network/{o}',[HomeController::class,'network']);
|
||||
|
||||
Route::middleware(['auth','can:admin'])->group(function () {
|
||||
Route::get('setup',[HomeController::class,'setup']);
|
||||
});
|
@ -14,7 +14,7 @@ class ExampleTest extends TestCase
|
||||
*/
|
||||
public function testBasicTest()
|
||||
{
|
||||
$response = $this->get('/');
|
||||
$response = $this->get('/about');
|
||||
|
||||
$response->assertStatus(200);
|
||||
}
|
||||
|
90
tests/Feature/SiteAdminTest.php
Normal file
90
tests/Feature/SiteAdminTest.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Tests\TestCase;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\Domain;
|
||||
|
||||
class SiteAdminTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
/**
|
||||
* Testing a unauthenticated visitor to the site.
|
||||
*/
|
||||
public function test_guestuser()
|
||||
{
|
||||
$this->get('about')
|
||||
->assertOk();
|
||||
|
||||
$this->get('ftn/domain')
|
||||
->assertRedirect('login');
|
||||
$this->get('ftn/node')
|
||||
->assertRedirect('login');
|
||||
$this->get('ftn/zone')
|
||||
->assertRedirect('login');
|
||||
|
||||
$this->get('network/1')
|
||||
->assertNotFound();
|
||||
|
||||
Domain::factory()->create([
|
||||
'id'=>1,
|
||||
'name'=>'test',
|
||||
]);
|
||||
|
||||
$this->get('network/1')
|
||||
->assertOK();
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify user who has registered by not verified their email
|
||||
*/
|
||||
public function test_unverified_user()
|
||||
{
|
||||
$user = User::factory()->make([
|
||||
'name'=>'Site Visitor',
|
||||
'email_verified_at'=>NULL,
|
||||
]);
|
||||
|
||||
// Use model in tests...
|
||||
$this->actingAs($user);
|
||||
|
||||
$this->get('ftn/domain')
|
||||
->assertRedirect('email/verify');
|
||||
$this->get('ftn/node')
|
||||
->assertRedirect('email/verify');
|
||||
$this->get('ftn/zone')
|
||||
->assertRedirect('email/verify');
|
||||
|
||||
Auth::logout();
|
||||
}
|
||||
|
||||
public function test_site_admin()
|
||||
{
|
||||
// Site Visitor
|
||||
$this->get('setup')
|
||||
->assertRedirect('login');
|
||||
|
||||
// Valid User
|
||||
$user = User::factory()->make([
|
||||
'name'=>'Site User',
|
||||
]);
|
||||
$this->actingAs($user);
|
||||
|
||||
$this->get('setup')
|
||||
->assertForbidden();
|
||||
|
||||
// Admin User
|
||||
$user = User::factory()->admin()->make([
|
||||
'name'=>'Site User',
|
||||
]);
|
||||
$this->actingAs($user);
|
||||
|
||||
$this->get('setup')
|
||||
->assertOK();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user