15. Exercício prático – versão 7

15.1. Implémentation
Vamos agora retomar a versão 6, externalizando para um ficheiro de configuração as constantes utilizadas nos scripts principais. O ficheiro de configuração será o ficheiro jSON, cujo conteúdo será o seguinte:
{
"rootDirectory": "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07",
"databaseFilename": "Data/database.json",
"taxAdminDataFileName": "Data/taxadmindata.json",
"taxPayersDataFileName": "Data/taxpayersdata.json",
"resultsFileName": "Data/results.json",
"errorsFileName": "Data/errors.json",
"dependencies": {
"BaseEntity": "/../version-05/Entities/BaseEntity.php",
"TaxAdminData": "/../version-05/Entities/TaxAdminData.php",
"TaxPayerData": "/../version-05/Entities/TaxPayerData.php",
"Database": "/../version-05/Entities/Database.php",
"ExceptionImpots": "/../version-05/Entities/ExceptionImpots.php",
"Utilitaires": "/../version-05/Utilities/Utilitaires.php",
"InterfaceDao": "/../version-05/Dao/InterfaceDao.php",
"TraitDao": "/../version-05/Dao/TraitDao.php",
"InterfaceDao4TransferAdminData2Database": "/../version-05/Dao/InterfaceDao4TransferAdminData2Database.php",
"DaoTransferAdminDataFromJsonFile2Database": "/../version-05/Dao/DaoTransferAdminDataFromJsonFile2Database.php",
"DaoImpotsWithTaxAdminDataInDatabase": "/../version-05/Dao/DaoImpotsWithTaxAdminDataInDatabase.php",
"InterfaceMetier": "/../version-05/Métier/InterfaceMetier.php",
"Metier": "/../version-05/Métier/Metier.php"
},
"dependencies4calculate": [
"BaseEntity",
"TaxAdminData",
"TaxPayerData",
"Database",
"ExceptionImpots",
"Utilitaires",
"InterfaceDao",
"TraitDao",
"DaoImpotsWithTaxAdminDataInDatabase",
"InterfaceMetier",
"Metier"],
"dependencies4transfer": [
"BaseEntity",
"TaxAdminData",
"Database",
"ExceptionImpots",
"Utilitaires",
"InterfaceDao",
"TraitDao",
"InterfaceDao4TransferAdminData2Database",
"DaoTransferAdminDataFromJsonFile2Database"]
}
Nesta configuração:
- linha 2: a pasta a partir da qual todos os caminhos deste ficheiro de configuração são calculados;
- linhas 3-7: os caminhos de todos os ficheiros jSON da aplicação;
- linhas 8-22: os caminhos de todos os ficheiros da aplicação, no formato [clé=>chemin];
- linhas 23-34: as dependências para o cálculo do imposto, sob a forma de uma lista de chaves do dicionário [dependencies] (linhas 8-22);
- linhas 35-44: as dependências para a transferência para a base de dados dos ficheiros jSON e [taxadmindata.json], sob a forma de uma lista de chaves do dicionário [dependencies] (linhas 8-22);
O script de transferência para a base de dados da administração fiscal [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] passa a ser o seguinte:
<?php
// respeito rigoroso dos tipos declarados dos parâmetros das funções
declare (strict_types=1);
// espaço de nomes
namespace Application;
// gestão de erros por PHP
// ini_set("display_errors", "0");
//
// caminho do ficheiro de configuração
define("CONFIG_FILENAME", "../Data/config.json");
// recupera-se a configuração
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// inclui-se as dependências necessárias ao script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4transfer"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// definição das constantes
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXADMINDATA_FILENAME", "$rootDirectory/{$config["taxAdminDataFileName"]}");
//
try {
// criação da camada [dao]
$dao = new DaoTransferAdminDataFromJsonFile2Database(DATABASE_CONFIG_FILENAME, TAXADMINDATA_FILENAME);
// transferência dos dados para a base de dados
$dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
// exibe-se o erro
print $ex->getMessage() . "\n";
}
// fim
print "Terminé\n";
exit;
Comentários
O código mantém-se igual ao apresentado no parágrafo com o link. A única diferença é a utilização do ficheiro [config.json] em vez das constantes nas linhas 18-26;
- linha 16: a função [file_get_contents] transfere o ficheiro [config.json] para uma cadeia de caracteres. A função [json_decode] utiliza, em seguida, essa cadeia para construir o dicionário [$config]. O segundo parâmetro [true] da função [json_decode] indica que se pretende criar um dicionário;
- linhas 19-22: incluem-se as dependências necessárias para o script de transferência de dados do ficheiro [taxadmindata.json] para a base de dados;
- [$config["dependencies4transfer"]] é a tabela das dependências necessárias para o script de transferência. Trata-se de uma lista de chaves. Os caminhos dos ficheiros a incluir no projeto encontram-se no dicionário [$config["dependencies"]];
- $config["rootDirectory"] representa o caminho com o qual os ficheiros a incluir devem ser prefixados;
Da mesma forma, o script de cálculo do imposto passa a ser o seguinte: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:
<?php
// respeito rigoroso dos tipos declarados dos parâmetros das funções
declare (strict_types=1);
// espaço de nomes
namespace Application;
// gestão de erros por PHP
// ini_set("display_errors", "0");
//
// caminho do ficheiro de configuração
define("CONFIG_FILENAME", "../Data/config.json");
// recupera-se a configuração
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// inclui-se as dependências necessárias ao script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// definição das constantes
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
define("TAXPAYERSDATA_FILENAME", "$rootDirectory/{$config["taxPayersDataFileName"]}");
define("RESULTS_FILENAME", "$rootDirectory/{$config["resultsFileName"]}");
define("ERRORS_FILENAME", "$rootDirectory/{$config["errorsFileName"]}");
//
try {
// criação da camada [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// criação da camada [métier]
$métier = new Metier($dao);
// cálculo dos impostos em modo batch
$métier->executeBatchImpots(TAXPAYERSDATA_FILENAME, RESULTS_FILENAME, ERRORS_FILENAME);
} catch (ExceptionImpots $ex) {
// exibição do erro
print "Une erreur s'est produite : " . utf8_encode($ex->getMessage()) . "\n";
}
// fim
print "Terminé\n";
exit;
15.2. Testes [Codeception]
Esta versão, tal como as anteriores, é validada através de testes [Codeception].

15.2.1. Teste da camada [dao]
O teste [DaoTest.php] é o seguinte:
<?php
// respeito rigoroso dos tipos declarados dos parâmetros das funções
declare (strict_types=1);
// espaço de nomes
namespace Application;
// definição de constantes
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// caminho do ficheiro de configuração
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// recupera-se a configuração
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// inclui-se as dependências necessárias para o script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// outras constantes
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// teste -----------------------------------------------------
class DaoTest extends \Codeception\Test\Unit {
// TaxAdminData
private $taxAdminData;
public function __construct() {
parent::__construct();
// criação da camada [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
$this->taxAdminData = $dao->getTaxAdminData();
}
// testes
public function testTaxAdminData() {
…
}
}
Comentários
- linhas 9-21: definição do ambiente de teste. Utilizamos o mesmo ambiente, sem a camada [métier], que o utilizado pelo script principal [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase] descrito no parágrafo com o link;
- linhas 29-34: construção da camada [dao];
- linha 33: o atributo [$this→taxAdminData] contém os dados a testar;
- linhas 37-39: o método [testTaxAdminData] é o descrito no parágrafo «ligação»;
Os resultados do teste são os seguintes:

15.2.2. Teste da camada [métier]
O teste [MetierTest.php] é o seguinte:
<?php
// respeito rigoroso pelos tipos declarados dos parâmetros das funções
declare (strict_types=1);
// espaço de nomes
namespace Application;
// definição de constantes
define("ROOT", "C:/Data/st-2019/dev/php7/poly/scripts-console/impots/version-07");
// caminho do ficheiro de configuração
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// recuperar a configuração
$config = \json_decode(\file_get_contents(CONFIG_FILENAME), true);
// inclui-se as dependências necessárias para o script
$rootDirectory = $config["rootDirectory"];
foreach ($config["dependencies4calculate"] as $dependency) {
require $rootDirectory . $config["dependencies"][$dependency];
}
// outras constantes
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");
// classe de teste
class MetierTest extends \Codeception\Test\Unit {
// camada de negócio
private $métier;
public function __construct() {
parent::__construct();
// criação da camada [dao]
$dao = new DaoImpotsWithTaxAdminDataInDatabase(DATABASE_CONFIG_FILENAME);
// criação da camada [métier]
$this->métier = new Metier($dao);
}
// testes
public function test1() {
…
}
-----------------------------------
public function test11() {
…
}
}
Comentários
- linhas 9-21: definição do ambiente de teste. Utilizamos o mesmo ambiente que o utilizado pelo script principal [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase], descrito no parágrafo com o link;
- linhas 28-34: construção da camada [dao];
- linha 33: o atributo [$this→métier] é uma referência à camada [métier] a testar;
- linhas 37-45: os métodos [test1, test2…, test11] são os descritos no parágrafo «ligação»;
Os resultados do teste são os seguintes:
