Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,20 @@ SENHAUNICA_CALLBACK_ID=1
SENHAUNICA_ADMINS=1111
SENHAUNICA_DEV="http://auth.local:3141/wsusuario/oauth"
SENHAUNICA_DEBUG=true
SENHAUNICA_USAR_REPLICADO=false


########## QUOTAS ##########
CUPS_SERVER_IP=cups
PRINTING_DRIVER=cups
CUPS_SERVER_USERNAME=admin
CUPS_SERVER_PASSWORD=admin
CUPS_SERVER_USERNAME=print
CUPS_SERVER_PASSWORD=print

#Ativa o uso do replicado para obter os monitores (default: true)
#REPLICADO_MONITORES=true
REPLICADO_MONITORES=true

#Lista os monitores caso REPLICADO_MONITORES=false (default: vazio)
#MONITORES=
MONITORES=111111
IMPRESSORAS_CODSLAMON=22

########## WSFOTO ##########
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/dusk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,19 @@ jobs:
- name: Build and start containers
run: docker compose up -d --build

- name: Wait for CUPS printer
run: |
for i in {1..30}; do
if docker compose exec -T cups lpstat -v 2>/dev/null | grep -q ImpressoraTesteDusk001; then
echo "CUPS printer is ready"
exit 0
fi
echo "Waiting for CUPS..."
sleep 2
done
docker compose logs cups
exit 1

- name: Wait for MariaDB
run: |
for i in {1..40}; do
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ yarn-error.log
resources/ISOuncoated.icc
resources/PDFX_def.ps
/.ddev/

.env.dusk.local
.phpunit.cache
1 change: 1 addition & 0 deletions app/Http/Requests/PrintingRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ public function failedValidation(Validator $validator)
]));
}
*/
}
12 changes: 6 additions & 6 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ services:
container_name: impressoras_cups
ports:
- '8631:631'
volumes:
- ./docker/cups/init-printers.sh:/init-printers.sh:ro
entrypoint: ["/bin/sh", "/init-printers.sh"]
environment:
- CUPS_ADMIN=print
- CUPS_PASSWORD=print
Expand Down
25 changes: 25 additions & 0 deletions docker/cups/init-printers.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/sh

# sobe o cupsd em background
/usr/sbin/cupsd -f &
CUPSD_PID=$!
trap 'kill $CUPSD_PID' TERM INT

# espera o CUPS responder (no máximo ~60s)
for i in $(seq 1 60); do
lpstat -r >/dev/null 2>&1 && break
sleep 1
done

# procura o PPD do cups-pdf (impressora virtual); se não achar, usa o genérico
PPD=$(lpinfo -m 2>/dev/null | grep -i 'cups-pdf' | head -n1 | awk '{print $1}')
echo "init-printers: PPD escolhido = ${PPD:-genérico}"

# cria e habilita a impressora de teste (nome = machine_name no sistema)
if lpadmin -p ImpressoraTesteDusk001 -E -v cups-pdf:/ -m "${PPD:-drv:///sample.drv/generic.ppd}"; then
echo "init-printers: impressora ImpressoraTesteDusk001 criada"
else
echo "init-printers: ERRO ao criar a impressora (o CUPS continua no ar)"
fi

wait $CUPSD_PID
6 changes: 5 additions & 1 deletion phpunit.dusk.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
backupStaticProperties="false">
<testsuites>
<testsuite name="Browser Test Suite">
<directory suffix="Test.php">./tests/Browser</directory>
<file>./tests/Browser/IndexTest.php</file>
<file>./tests/Browser/RegraCrudTest.php</file>
<file>./tests/Browser/ImpressoraCrudTest.php</file>
<file>./tests/Browser/AssistantCrudTest.php</file>
<file>./tests/Browser/LocalUserCrudTest.php</file>
</testsuite>
</testsuites>
</phpunit>
103 changes: 103 additions & 0 deletions tests/Browser/AssistantCrudTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?php

namespace Tests\Browser;

use App\Models\Assistant;
use App\Models\Printer;
use App\Models\Rule;
use Illuminate\Foundation\Testing\DatabaseTruncation;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

/**
* CRUD de monitores (/assistants) + verificação do gate "monitor"
* para um usuário NÃO admin cadastrado como monitor.
*/
class AssistantCrudTest extends DuskTestCase
{
use DatabaseTruncation;

private function loginAdmin(Browser $browser)
{
$browser->visit('/')
->clickLink('Entrar')
->waitFor('#loginUsuario')
->typeSlowly('loginUsuario', '1111')
->press('Login')
->waitForText('Impressoras', 10);
}

private function criaRegra()
{
return Rule::create([
'name' => 'Regra Fila',
'queue_control' => 1,
'quota_period' => 'Mensal',
'quota' => 100,
'quota_type' => 'Páginas',
]);
}

private function criaImpressora(Rule $rule)
{
return Printer::create([
'name' => 'Impressora Fila',
'machine_name' => 'ImpressoraTesteDusk001',
'location' => 'Sala',
'rule_id' => $rule->id,
'active' => true,
]);
}

public function test_crud_assistant()
{
$rule = $this->criaRegra();
$printer = $this->criaImpressora($rule);

$this->browse(function (Browser $browser) use ($printer,$rule) {
// login como adm
$this->loginAdmin($browser);

// CREATE
$browser->visit('/assistants')
->waitForText('Monitores')
->click('#btn-adicionar-codpes')
->waitFor('#modal-adicionar-codpes')
->waitFor('.select2-search__field')
->type('.select2-search__field', '111111')
->waitForText('Lucas Andrade Ferreira')
->click('.select2-results__option--highlighted, .select2-results__option:first-child')
->click('#modal-adicionar-codpes .btn-submit')
->waitForText('111111', 10)
->assertSee('111111');

// login como monitor
$browser->clickLink('Sair')
->waitForLink('Entrar', 10)
->visit('/')
->clickLink('Entrar')
->waitFor('#loginUsuario')
->typeSlowly('loginUsuario', '111111')
->press('Login')
->waitForText('Impressoras', 10);

// monitor acessa a fila de autorização
$browser->visit("/printers")
->clickLink('Autorização')
->waitForLocation("/printers/auth_queue/{$printer->id}")
->waitForText('Fila de autorização')
->clickLink('Sair');

$this->loginAdmin($browser); // loga como adm novamente

// DELETE: monitor local tem botão excluir
$browser->visit('/assistants')
->waitForText('Monitores', 10)
->waitForText('111111', 10)
->click('#actions button[type=submit]')
->acceptDialog()
->waitUntilMissingText('111111')
->assertDontSee('111111');
});
}
}
102 changes: 102 additions & 0 deletions tests/Browser/ImpressoraCrudTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

namespace Tests\Browser;

use App\Models\Printer;
use App\Models\Rule;
use Illuminate\Foundation\Testing\DatabaseTruncation;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class ImpressoraCrudTest extends DuskTestCase
{
use DatabaseTruncation;

private function criaRegra(): Rule
{
return Rule::create([
'name' => 'Regra Teste Dusk',
'queue_control' => 0,
'quota_period' => 'Mensal',
'quota' => 100,
'quota_type' => 'Páginas',
]);
}

public function test_crud_impressora()
{
$rule = $this->criaRegra();

$this->browse(function (Browser $browser) use ($rule) {
// Login como admin
$browser->visit('/')
->clickLink('Entrar')
->waitFor('#loginUsuario')
->typeSlowly('loginUsuario', '1111')
->press('Login')
->waitForText('Impressoras', 5)
->assertSee('Impressoras');

// CREATE
$browser->visit('/printers')
->clickLink('Adicionar impressora')
->waitFor('input[name=name]')
->type('name', 'Impressora Teste Dusk')
->type('machine_name', 'ImpressoraTesteDusk001')
->type('location', 'Sala de Testes')
->select('rule_id', (string) $rule->id)
->press('Enviar')
->waitForLocation('/printers')
->assertSee('Impressora Teste Dusk');

// READ
$browser->visit('/printers')
->waitForText('Impressora Teste Dusk')
->assertSee('Regra Teste Dusk');

// UPDATE
$browser->click('a[href*="/printers/"][href$="/edit"]')
->waitFor('input[name=name]')
->clear('name')
->type('name', 'Impressora Teste Dusk Editada')
->press('Enviar')
->waitForLocation('/printers')
->assertSee('Impressora Teste Dusk Editada');

// DELETE
$browser->visit('/printers')
->waitForText('Impressora Teste Dusk Editada')
->click('#actions button[type=submit]')
->acceptDialog()
->waitUntilMissingText('Impressora Teste Dusk Editada')
->assertDontSee('Impressora Teste Dusk Editada');
});
}

// Usa fila criada no CUPS (init-printers.sh).
public function test_impressao_de_teste()
{
$rule = $this->criaRegra();
$printer = Printer::create([
'name' => 'Impressora Teste Dusk',
'machine_name' => 'ImpressoraTesteDusk001',
'location' => 'Sala de Testes',
'rule_id' => $rule->id,
'active' => true,
]);

$this->browse(function (Browser $browser) use ($printer) {
$browser->visit('/')
->clickLink('Entrar')
->waitFor('#loginUsuario')
->typeSlowly('loginUsuario', '1111')
->press('Login')
->waitForText('Impressoras', 5)
->visit("/printers")
->waitForText('Impressora Teste Dusk')
->click("a[href='/printers/{$printer->id}/printtest']")
->waitForText('Teste de impressão enviado com sucesso', 15)
->assertSee('Teste de impressão enviado com sucesso');
});
}
}
Loading
Loading