test: Add feature tests
This commit is contained in:
parent
52620bc331
commit
45cc84c99c
17 changed files with 360 additions and 31 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -41,7 +41,7 @@ jobs:
|
||||||
run: yarn && yarn dev
|
run: yarn && yarn dev
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: ./vendor/bin/phpunit
|
run: php artisan test
|
||||||
env:
|
env:
|
||||||
APP_ENV: testing
|
APP_ENV: testing
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App;
|
namespace App;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Relations\Pivot;
|
use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,4 +23,5 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
|
||||||
*/
|
*/
|
||||||
class ItemTag extends Pivot
|
class ItemTag extends Pivot
|
||||||
{
|
{
|
||||||
|
use HasFactory;
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,8 +137,11 @@ class AppServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
$db_type = config()->get('database.default');
|
$db_type = config()->get('database.default');
|
||||||
|
|
||||||
if ($db_type == 'sqlite' && ! is_file(database_path('app.sqlite'))) {
|
if ($db_type == 'sqlite') {
|
||||||
touch(database_path('app.sqlite'));
|
$db_file = database_path(env('DB_DATABASE', 'app.sqlite'));
|
||||||
|
if (! is_file($db_file)) {
|
||||||
|
touch($db_file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->needsDBUpdate()) {
|
if ($this->needsDBUpdate()) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App;
|
namespace App;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
|
@ -45,6 +46,8 @@ class User extends Authenticatable
|
||||||
{
|
{
|
||||||
use Notifiable;
|
use Notifiable;
|
||||||
|
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
*
|
*
|
||||||
|
|
|
@ -4,7 +4,6 @@ namespace Database\Factories;
|
||||||
|
|
||||||
use App\Item;
|
use App\Item;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
use Illuminate\Support\Str;
|
|
||||||
|
|
||||||
class ItemFactory extends Factory
|
class ItemFactory extends Factory
|
||||||
{
|
{
|
||||||
|
@ -20,7 +19,7 @@ class ItemFactory extends Factory
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function definition()
|
public function definition(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'title' => $this->faker->unique()->text(),
|
'title' => $this->faker->unique()->text(),
|
||||||
|
|
27
database/factories/ItemTagFactory.php
Normal file
27
database/factories/ItemTagFactory.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Item;
|
||||||
|
use App\ItemTag;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
class ItemTagFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = ItemTag::class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,11 +2,19 @@
|
||||||
|
|
||||||
namespace Database\Factories;
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\User;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
class UserFactory extends Factory
|
class UserFactory extends Factory
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The name of the factory's corresponding model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $model = User::class;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the model's default state.
|
* Define the model's default state.
|
||||||
*
|
*
|
||||||
|
@ -15,10 +23,10 @@ class UserFactory extends Factory
|
||||||
public function definition()
|
public function definition()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => $this->faker->name(),
|
'username' => $this->faker->name(),
|
||||||
'email' => $this->faker->unique()->safeEmail(),
|
'email' => $this->faker->unique()->safeEmail(),
|
||||||
'email_verified_at' => now(),
|
|
||||||
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
|
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
|
||||||
|
'public_front' => 1,
|
||||||
'remember_token' => Str::random(10),
|
'remember_token' => Str::random(10),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
50
tests/.env.testing
Normal file
50
tests/.env.testing
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
APP_NAME=Heimdall
|
||||||
|
APP_ENV=local
|
||||||
|
APP_KEY=
|
||||||
|
APP_DEBUG=false
|
||||||
|
APP_URL=http://localhost
|
||||||
|
|
||||||
|
LOG_CHANNEL=daily
|
||||||
|
|
||||||
|
DB_CONNECTION=sqlite
|
||||||
|
DB_DATABASE=test.sqlite
|
||||||
|
|
||||||
|
#DB_CONNECTION=<mysql | pgsql>
|
||||||
|
#DB_HOST=<hostname | ip>
|
||||||
|
#DB_PORT=<port number>
|
||||||
|
#DB_DATABASE=<database>
|
||||||
|
#DB_USERNAME=<user>
|
||||||
|
#DB_PASSWORD=<password>
|
||||||
|
|
||||||
|
BROADCAST_DRIVER=log
|
||||||
|
CACHE_DRIVER=file
|
||||||
|
QUEUE_CONNECTION=sync
|
||||||
|
SESSION_DRIVER=file
|
||||||
|
SESSION_LIFETIME=120
|
||||||
|
QUEUE_DRIVER=sync
|
||||||
|
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PASSWORD=null
|
||||||
|
REDIS_PORT=6379
|
||||||
|
|
||||||
|
MAIL_MAILER=smtp
|
||||||
|
MAIL_HOST=smtp.mailtrap.io
|
||||||
|
MAIL_PORT=2525
|
||||||
|
MAIL_USERNAME=null
|
||||||
|
MAIL_PASSWORD=null
|
||||||
|
MAIL_ENCRYPTION=null
|
||||||
|
MAIL_FROM_ADDRESS=null
|
||||||
|
MAIL_FROM_NAME="${APP_NAME}"
|
||||||
|
|
||||||
|
AWS_ACCESS_KEY_ID=
|
||||||
|
AWS_SECRET_ACCESS_KEY=
|
||||||
|
AWS_DEFAULT_REGION=us-east-1
|
||||||
|
AWS_BUCKET=
|
||||||
|
|
||||||
|
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}"
|
|
@ -15,6 +15,8 @@ trait CreatesApplication
|
||||||
{
|
{
|
||||||
$app = require __DIR__.'/../bootstrap/app.php';
|
$app = require __DIR__.'/../bootstrap/app.php';
|
||||||
|
|
||||||
|
$app->loadEnvironmentFrom('tests/.env.testing');
|
||||||
|
|
||||||
$app->make(Kernel::class)->bootstrap();
|
$app->make(Kernel::class)->bootstrap();
|
||||||
|
|
||||||
return $app;
|
return $app;
|
||||||
|
|
83
tests/Feature/DashTest.php
Normal file
83
tests/Feature/DashTest.php
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Item;
|
||||||
|
use App\ItemTag;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class DashTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helpers
|
||||||
|
*/
|
||||||
|
|
||||||
|
private function addPinnedItemWithTitleToDB($title)
|
||||||
|
{
|
||||||
|
$item = Item::factory()
|
||||||
|
->create([
|
||||||
|
'title' => $title,
|
||||||
|
'pinned' => 1,
|
||||||
|
]);
|
||||||
|
|
||||||
|
ItemTag::factory()->create([
|
||||||
|
'item_id' => $item->id,
|
||||||
|
'tag_id' => 0,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addTagWithTitleToDB($title)
|
||||||
|
{
|
||||||
|
Item::factory()
|
||||||
|
->create([
|
||||||
|
'title' => $title,
|
||||||
|
'type' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Cases
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function test_loads_empty_dash()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$response = $this->get('/');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_items_on_the_dash()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$this->addPinnedItemWithTitleToDB('Item 1');
|
||||||
|
$this->addPinnedItemWithTitleToDB('Item 2');
|
||||||
|
$this->addPinnedItemWithTitleToDB('Item 3');
|
||||||
|
|
||||||
|
$response = $this->get('/');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('Item 1');
|
||||||
|
$response->assertSee('Item 2');
|
||||||
|
$response->assertSee('Item 3');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_tags_on_the_dash()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$this->addTagWithTitleToDB('Tag 1');
|
||||||
|
$this->addTagWithTitleToDB('Tag 2');
|
||||||
|
|
||||||
|
$response = $this->get('/');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('Tag 1');
|
||||||
|
$response->assertSee('Tag 2');
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Tests\Feature;
|
|
||||||
|
|
||||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
||||||
use Tests\TestCase;
|
|
||||||
|
|
||||||
class ExampleTest extends TestCase
|
|
||||||
{
|
|
||||||
use RefreshDatabase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A basic test example.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function test_app_loads()
|
|
||||||
{
|
|
||||||
$response = $this->get('/');
|
|
||||||
|
|
||||||
$response->assertStatus(200);
|
|
||||||
}
|
|
||||||
}
|
|
32
tests/Feature/ItemCreateTest.php
Normal file
32
tests/Feature/ItemCreateTest.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class ItemCreateTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
public function test_displays_the_item_create_page()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$response = $this->get('/items/create');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function test_display_the_home_dashboard_tag()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$response = $this->get('/items/create');
|
||||||
|
|
||||||
|
$response->assertSee('Home dashboard');
|
||||||
|
}
|
||||||
|
}
|
34
tests/Feature/ItemListTest.php
Normal file
34
tests/Feature/ItemListTest.php
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Item;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class ItemListTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
protected function addItemWithTitleToDB($title)
|
||||||
|
{
|
||||||
|
Item::factory()
|
||||||
|
->create([
|
||||||
|
'title' => $title
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_items_on_the_item_list_page()
|
||||||
|
{
|
||||||
|
$this->addItemWithTitleToDB('Item 1');
|
||||||
|
$this->addItemWithTitleToDB('Item 2');
|
||||||
|
$this->addItemWithTitleToDB('Item 3');
|
||||||
|
|
||||||
|
$response = $this->get('/items');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('Item 1');
|
||||||
|
$response->assertSee('Item 2');
|
||||||
|
$response->assertSee('Item 3');
|
||||||
|
}
|
||||||
|
}
|
32
tests/Feature/SettingsTest.php
Normal file
32
tests/Feature/SettingsTest.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class SettingsTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
public function test_displays_the_settings_page()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$response = $this->get('/settings');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSeeInOrder([
|
||||||
|
'Version',
|
||||||
|
'Language',
|
||||||
|
'Support',
|
||||||
|
'Donate',
|
||||||
|
'Background Image',
|
||||||
|
'Homepage Search',
|
||||||
|
'Default Search Provider',
|
||||||
|
'Link opens in',
|
||||||
|
'Custom CSS',
|
||||||
|
'Custom JavaScript',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
35
tests/Feature/TagListTest.php
Normal file
35
tests/Feature/TagListTest.php
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Item;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class TagListTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
private function addTagWithTitleToDB($title)
|
||||||
|
{
|
||||||
|
Item::factory()
|
||||||
|
->create([
|
||||||
|
'title' => $title,
|
||||||
|
'type' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_the_tags_on_the_tag_list_page()
|
||||||
|
{
|
||||||
|
$this->addTagWithTitleToDB('Tag 1');
|
||||||
|
$this->addTagWithTitleToDB('Tag 2');
|
||||||
|
$this->addTagWithTitleToDB('Tag 3');
|
||||||
|
|
||||||
|
$response = $this->get('/tags');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('Tag 1');
|
||||||
|
$response->assertSee('Tag 2');
|
||||||
|
$response->assertSee('Tag 3');
|
||||||
|
}
|
||||||
|
}
|
42
tests/Feature/UserListTest.php
Normal file
42
tests/Feature/UserListTest.php
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\User;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class UserListTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
protected function addUserWithNameToDB($name)
|
||||||
|
{
|
||||||
|
User::factory()
|
||||||
|
->create([
|
||||||
|
'username' => $name
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_admin_on_user_list_page_when_default_install()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$response = $this->get('/users');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_displays_users_on_user_list_page()
|
||||||
|
{
|
||||||
|
$this->seed();
|
||||||
|
|
||||||
|
$this->addUserWithNameToDB('User 1');
|
||||||
|
|
||||||
|
$response = $this->get('/users');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
$response->assertSee('User 1');
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue