Skip to content

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

Image

15.1. Implémentation

Aqui, retomaremos a versão 6, externalizando em um arquivo de configuração as constantes utilizadas nos scripts principais. O arquivo de configuração será o 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 arquivo de configuração são calculados;
  • linhas 3-7: os caminhos de todos os arquivos jSON do aplicativo;
  • linhas 8 a 22: os caminhos de todos os arquivos do aplicativo, no formato [clé=>chemin];
  • linhas 23-34: as dependências para o cálculo do imposto na forma de uma lista de chaves do dicionário [dependencies] (linhas 8-22);
  • linhas 35-44: as dependências para a transferência para o banco de dados dos arquivos jSON e [taxadmindata.json], na forma de uma lista de chaves do dicionário [dependencies] (linhas 8-22);

O script de transferência para o banco de dados da administração fiscal [MainTransferAdminDataFromFile2PostgresSQLDatabase.php] fica da seguinte forma:


<?php

// respeito estrito aos 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 arquivo 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 o banco de dados
  $dao->transferAdminData2Database();
} catch (ExceptionImpots $ex) {
  // exibe o erro
  print $ex->getMessage() . "\n";
}
// fim
print "Terminé\n";
exit;

Comentários

O código permanece o mesmo do parágrafo anterior. A única diferença é a utilização do arquivo [config.json] em vez das constantes nas linhas 18 a 26;

  • linha 16: a função [file_get_contents] converte o arquivo [config.json] em uma cadeia de caracteres. A função [json_decode] utiliza essa cadeia para construir o dicionário [$config]. O segundo parâmetro [true] da função [json_decode] indica que se deseja construir um dicionário;
  • linhas 19-22: incluem-se as dependências necessárias para o script de transferência de dados do arquivo [taxadmindata.json] para o banco 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 arquivos a serem incluídos no projeto são encontrados no dicionário [$config["dependencies"]];
    • $config["rootDirectory"] representa o caminho que deve ser usado como prefixo para os arquivos a serem incluídos;

Da mesma forma, o script de cálculo do imposto passa a ser o seguinte: [MainCalculateImpotsWithTaxAdminDataInPostgresDatabase]:


<?php

// respeito estrito aos 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 arquivo de configuração
define("CONFIG_FILENAME", "../Data/config.json");

// recuperamos 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 de 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, assim como as anteriores, é validada por testes [Codeception].

Image

15.2.1. Teste da camada [dao]

O teste [DaoTest.php] é o seguinte:


<?php

// respeito estrito aos 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 arquivo de configuração
define("CONFIG_FILENAME", ROOT."/Data/config.json");
// recuperamos 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];
}
// 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 do link;
  • linhas 29-34: construção da camada [dao];
  • linha 33: o atributo [$this→taxAdminData] contém os dados a serem testados;
  • linhas 37-39: o método [testTaxAdminData] é aquele descrito no parágrafo do link;

Os resultados do teste são os seguintes:

Image

15.2.2. Teste da camada [métier]

O teste [MetierTest.php] é o seguinte:


<?php

// respeito estrito aos 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 arquivo de configuração
define("CONFIG_FILENAME", ROOT . "/Data/config.json");
// recuperação da 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];
}
// outras constantes
define("DATABASE_CONFIG_FILENAME", "$rootDirectory/{$config["databaseFilename"]}");

// classe de teste
class MetierTest extends \Codeception\Test\Unit {
  // camada de negócios
  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 usado 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 ser testada;
  • linhas 37-45: os métodos [test1, test2…, test11] são os descritos no parágrafo “link”;

Os resultados do teste são os seguintes:

Image