Skip to content

Commit

Permalink
Merge pull request #479 from ckrack/feat/init-data-file-on-add-hydrom…
Browse files Browse the repository at this point in the history
…eter

feat: init data file on add hydrometer
  • Loading branch information
ckrack authored Feb 27, 2024
2 parents c2b1576 + 898837f commit b539c50
Show file tree
Hide file tree
Showing 12 changed files with 255 additions and 51 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
- name: Setup PHP, extensions and composer with shivammathur/setup-php
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
php-version: 8.2
extensions: mbstring, xml, ctype, iconv, intl, pdo, pdo_mysql, dom, filter, gd, iconv, json
env:
update: true
Expand All @@ -35,13 +35,17 @@ jobs:
run: vendor/bin/requirements-checker

- name: Check Style
run: vendor/bin/php-cs-fixer check --no-ansi --no-interaction
run: vendor/bin/php-cs-fixer check --no-ansi --no-interaction --show-progress=none

- name: Warm cache
run: php bin/console cache:warmup

- name: Static analysis
run: vendor/bin/phpstan --no-ansi --no-interaction --no-progress

- name: Setup test db
run: |
php bin/console doctrine:migrations:migrate --no-interaction --env=test
- name: Test
run: php bin/phpunit --no-interaction
12 changes: 6 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
{
"name": "ckrack/hydrometer-public-server",
"description": "Public server for electronic hydrometers for homebrewing",
"type": "project",
"license": "MIT",
"type": "project",
"keywords": [

"ispindle",
"ispindel",
"craftbeer",
Expand All @@ -21,15 +20,16 @@
}
],
"require": {
"php": ">=8.1",
"php": ">=8.2",
"ext-ctype": "*",
"ext-iconv": "*",
"ext-sockets": "*",
"doctrine/dbal": "^3",
"doctrine/doctrine-bundle": "^2.11",
"doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.0",
"symfony/apache-pack": "^1.0",
"symfony/asset": "7.0.*",
"symfony/asset": "~7.0.0",
"symfony/console": "~7.0.0",
"symfony/doctrine-messenger": "~7.0.0",
"symfony/dotenv": "~7.0.0",
Expand Down Expand Up @@ -89,9 +89,9 @@
"allow-plugins": {
"ergebnis/composer-normalize": true,
"php-http/discovery": true,
"phpstan/extension-installer": true,
"symfony/flex": true,
"symfony/runtime": true,
"phpstan/extension-installer": true
"symfony/runtime": true
},
"sort-packages": true
},
Expand Down
45 changes: 23 additions & 22 deletions composer.lock

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

6 changes: 6 additions & 0 deletions src/Entity/Hydrometer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use App\Repository\HydrometerRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Uid\Ulid;

#[ORM\Entity(repositoryClass: HydrometerRepository::class)]
Expand Down Expand Up @@ -46,4 +47,9 @@ public function setName(?string $name): void
{
$this->name = $name;
}

public static function getFilenameForIdFromParameterBag(ParameterBagInterface $parameterBag, Ulid $id): string
{
return $parameterBag->get('kernel.project_dir').'/public/data/'.$id->__toString().'.json';
}
}
22 changes: 21 additions & 1 deletion src/Handler/HydrometerAddedEventHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,42 @@
use App\Event\HydrometerAddedEvent;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;

#[AsMessageHandler]
final readonly class HydrometerAddedEventHandler
{
public function __construct(
private ParameterBagInterface $parameterBag,
private EntityManagerInterface $entityManager,
private Filesystem $filesystem,
private LoggerInterface $logger,
) {
}

public function __invoke(HydrometerAddedEvent $hydrometerAddedEvent): void
{
$hydrometer = $this->addHydrometerToRepository($hydrometerAddedEvent);
$this->createEmptyDataFile($hydrometer);
$this->logger->info('Added hydrometer', [$hydrometerAddedEvent]);
}

public function createEmptyDataFile(Hydrometer $hydrometer): void
{
$this->filesystem->dumpFile(
Hydrometer::getFilenameForIdFromParameterBag($this->parameterBag, $hydrometer->getId()),
'[]'
);
}

public function addHydrometerToRepository(HydrometerAddedEvent $hydrometerAddedEvent): Hydrometer
{
$hydrometer = Hydrometer::create($hydrometerAddedEvent->getAggregateId());
$this->entityManager->persist($hydrometer);
$this->entityManager->flush();
$this->logger->info('Added hydrometer', [$hydrometerAddedEvent]);

return $hydrometer;
}
}
2 changes: 1 addition & 1 deletion src/Handler/HydrometerDataReceivedEventHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private function compileJsonData(HydrometerDataReceivedEvent $hydrometerDataRece

private function getFileName(HydrometerDataReceivedEvent $hydrometerDataReceivedEvent): string
{
return $this->parameterBag->get('kernel.project_dir').'/public/data/'.$hydrometerDataReceivedEvent->getAggregateId().'.json';
return Hydrometer::getFilenameForIdFromParameterBag($this->parameterBag, $hydrometerDataReceivedEvent->getAggregateId());
}

/**
Expand Down
2 changes: 1 addition & 1 deletion templates/hydrometer/new_hydrometer.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<div class="example-wrapper">
<h1>New hydrometer added ✅</h1>

Your hydrometer token is: {{ hydrometer_id }}<br>
Your hydrometer token is: <code>{{ hydrometer_id }}</code><br>
<a href="{{ path('app_show_data', {hydrometerId: hydrometer_id}) }}">Show it's data</a>
</div>

Expand Down
98 changes: 98 additions & 0 deletions tests/BrewingFlowFunctionalTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php

namespace App\Tests;

use App\Entity\Hydrometer;
use App\Repository\HydrometerRepository;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Uid\Ulid;

class BrewingFlowFunctionalTest extends WebTestCase
{
private static KernelBrowser $client;

public static function setUpBeforeClass(): void
{
self::$client = static::createClient();
self::bootKernel();
}

public static function tearDownAfterClass(): void
{
self::ensureKernelShutdown();
}

protected function tearDown(): void
{
}

protected function getService(string $id): mixed
{
return self::getContainer()
->get($id);
}

public function testCanAddHydrometer(): Hydrometer
{
$crawler = self::$client->request('POST', '/new');

$this->assertResponseIsSuccessful();
$this->assertSelectorTextContains('h1', 'New hydrometer added ✅');
$this->assertSelectorTextContains('.example-wrapper', 'Your hydrometer token is: ');

$hydrometerId = Ulid::fromString($crawler->filter('.example-wrapper code')->text());

$hydrometerRepository = $this->getService(HydrometerRepository::class);
$hydrometer = $hydrometerRepository->find($hydrometerId);
$this->assertInstanceOf(Hydrometer::class, $hydrometer);
$parameterBag = $this->getService(ParameterBagInterface::class);
$dataFilename = $parameterBag->get('kernel.project_dir').'/public/data/'.$hydrometer->getId().'.json';
$this->assertFileExists($dataFilename);
$this->assertStringEqualsFile($dataFilename, '[]');

return $hydrometer;
}

/**
* @depends testCanAddHydrometer
*/
public function testShowsEmptyData(Hydrometer $hydrometer): Hydrometer
{
$crawler = self::$client->request('GET', '/show/'.$hydrometer->getId());
$this->assertSelectorTextContains('h1', 'Data for '.$hydrometer->getId());

return $hydrometer;
}

/**
* @depends testShowsEmptyData
*/
public function testCanPostData(Hydrometer $hydrometer): Hydrometer
{
$data = [
'name' => 'Hydro-Test',
'ID' => '123456',
'angle' => 78.9,
'temperature' => 10.11,
'battery' => 5.43,
'gravity' => 12.34,
'token' => $hydrometer->getId(),
];
self::$client->request(
'POST',
'/data/'.$hydrometer->getId(),
content: json_encode($data, JSON_THROW_ON_ERROR)
);
$this->assertResponseIsSuccessful();
$parameterBag = $this->getService(ParameterBagInterface::class);
$dataFilename = $parameterBag->get('kernel.project_dir').'/public/data/'.$hydrometer->getId().'.json';
$jsonFromDataFile = (string) file_get_contents($dataFilename);
$savedData = json_decode($jsonFromDataFile, true, 512, JSON_THROW_ON_ERROR);
unset($savedData[0]['time']);
$this->assertEquals($data, $savedData[0]);

return $hydrometer;
}
}
Loading

0 comments on commit b539c50

Please sign in to comment.