Skip to content

Instantly share code, notes, and snippets.

@roberto-butti
Last active December 16, 2023 23:43
Show Gist options
  • Save roberto-butti/d490a8eb02bf4a540f7fd1715df18970 to your computer and use it in GitHub Desktop.
Save roberto-butti/d490a8eb02bf4a540f7fd1715df18970 to your computer and use it in GitHub Desktop.
GitHub Actions workflow for Laravel (automated test)
name: Laravel
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
laravel-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Copy .env
run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Create Database
run: |
mkdir -p database
touch database/database.sqlite
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: sqlite
DB_DATABASE: database/database.sqlite
run: vendor/bin/phpunit --testdox
@roberto-butti
Copy link
Author

Hi @hyhilman , as you can see we have a step that copy .env.ci into .env.
.env.ci is a basic env file (maybe you can start from .env.example included in your laravel installation) and edit these two parameters:

DB_CONNECTION=sqlite
DB_DATABASE=database/database.sqlite

Take a look this post:
https://medium.com/@robertodev/continuous-integration-with-github-actions-and-laravel-6-e6cb9aa5aea9

@michaeldigitalfractal
Copy link

I am having issue with session. Works on local machine. Always fails on Github Actions.

protected function signInAsAdmin($admin = null)
{
        $admin = $admin ?: factory('App\Admin')->create();
        $this->actingAs($admin, 'admin');

        return $admin; 
}

the test code looks like this

   /** @test */
    public function test_admin_can_update_a_referral()
    {
        $this->signInAsAdmin();

        $program = factory('App\Referral')->create();

        $this->patch(route('admin.referral.update', $referral->id), $attributes = [
            'name' => 'Changed'
        ])->assertRedirect(route('admin.referral.index'));
    }

Test passes on local. Fails on Github Actions with error Response status code [403] is not a redirect status code.

my phpunit.xml looks like this

    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>

@LarryBarker
Copy link

@michaeldigitalfractal I'm having a very similar issue, except I'm getting status code 500 not a redirect status code. Did you ever figure this out?

@roberto-butti
Copy link
Author

@LarryBarker
Copy link

@roberto-butti thanks for the reply. What am I looking for specifically? Mostly seems like dB configuration and docker setup? I’m not using any of that, and the error makes me think it’s not related to the database but routes? Correct me if I’m wrong though.

@roberto-butti
Copy link
Author

@roberto-butti thanks for the reply. What am I looking for specifically? Mostly seems like dB configuration and docker setup? I’m not using any of that, and the error makes me think it’s not related to the database but routes? Correct me if I’m wrong though.

@LarryBarker could you share here your snippet of your test ? I would like to replicate your issue, to see if I could help.

@LarryBarker
Copy link

Sure, it’s related to Livewire, but the test fails before the Livewire assertion. Here’s the first test that fails:

?php

namespace Tests\Feature\Auth;

use App\Admin;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Livewire;
use Tests\TestCase;

class LoginTest extends TestCase
{
use RefreshDatabase;

/** @test */
public function can_view_login_page()
{
    $this->get(route('login'))
        ->assertSuccessful()
        ->assertSeeLivewire('auth.login');
}

@roberto-butti
Copy link
Author

Hi @LarrayBraker, I'm using this basic yml file for GH Actions:

name: Laravel

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit --testdox

The Feature test used is:

<?php
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class RoutingTest extends TestCase
{
use RefreshDatabase;
    /** @test */
    public function can_view_login_page()
    {
        $this->get(route('login'))
            ->assertSuccessful();
    }
    /** @test */
    public function can_view_public_page()
    {
        $this->get(route('index'))
            ->assertSuccessful();
    }
    /** @test */
    public function can_not_view_protected_page()
    {
        $this->get(route('dashboard'))
            ->assertRedirect();
    }
}

this is ok, and everything is fine, locally and on github actions.
Now i will try to add "assertSeeLivewire" method

@roberto-butti
Copy link
Author

I have tried also the assertSeeLiverwire. method:

<?php
namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class RoutingTest extends TestCase
{
use RefreshDatabase;
    protected $seed = true;

    /** @test */
    public function can_view_login_page()
    {
        $this->get(route('login'))
            ->assertSuccessful();
    }
    /** @test */
    public function can_view_public_page()
    {
        $this->get(route('index'))
            ->assertSuccessful();
    }
    /** @test */
    public function can_not_view_protected_page()
    {
        $this->get(route('dashboard'))
            ->assertRedirect();
    }
    /** @test */
    public function user_can_view_protected_page()
    {
        $this->actingAs(User::first())->get(route('dashboard'))
            ->assertOk();
    }
    /** @test */
    public function user_can_view_protected_form()
    {
        $this->actingAs(User::first())->get(route('merchant.menu.create'))
            ->assertOk()->assertSeeLivewire("merchant.menu.edit-form");
    }
}

I updated yml file with these things:

  • using v2 of actions checkout: actions/checkout@v2
  • fixing directory pemrissions: chmod -R 777 storage bootstrap/cache
  • adding env parameters for DB_CONNECTION and DB_DATABASE

@LarryBarker
Copy link

LarryBarker commented Nov 18, 2020 via email

@sauerlock
Copy link

sauerlock commented Dec 16, 2023

I am getting this error in Git Actions in local works fine
Run php artisan test --parallel --recreate-databases
php artisan test --parallel --recreate-databases
shell: /usr/bin/bash -e {0}
env:
DB_CONNECTION: sqlite
DB_DATABASE: database/database.sqlite

.........................

Tests: 25 passed (59 assertions)
Duration: 1.00s

Parallel: 4 processes

Error: Process completed with exit code 1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment