From fc1dbeb0506c4ec2af8049f8b8cdccf937180ef4 Mon Sep 17 00:00:00 2001
From: Florent Morselli <florent.morselli@spomky-labs.com>
Date: Thu, 12 Dec 2024 19:19:45 +0100
Subject: [PATCH] Add JWECollector tests for builders, decrypters, and loaders

Introduce functional tests for `JWECollector` to verify support for JWE builders, decrypters, and loaders without requiring a compression method manager. These tests ensure proper data collection and structure validation for the `JWECollector` in various configurations.
---
 .../Encryption/JWECollectorTest.php           | 97 +++++++++++++++++++
 1 file changed, 97 insertions(+)
 create mode 100644 tests/Bundle/JoseFramework/Functional/Encryption/JWECollectorTest.php

diff --git a/tests/Bundle/JoseFramework/Functional/Encryption/JWECollectorTest.php b/tests/Bundle/JoseFramework/Functional/Encryption/JWECollectorTest.php
new file mode 100644
index 00000000..7f325968
--- /dev/null
+++ b/tests/Bundle/JoseFramework/Functional/Encryption/JWECollectorTest.php
@@ -0,0 +1,97 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Jose\Tests\Bundle\JoseFramework\Functional\Encryption;
+
+use Jose\Bundle\JoseFramework\DataCollector\JWECollector;
+use Jose\Bundle\JoseFramework\Services\JWEBuilderFactory as JWEBuilderFactoryService;
+use Jose\Bundle\JoseFramework\Services\JWEDecrypterFactory as JWEDecrypterFactoryService;
+use Jose\Bundle\JoseFramework\Services\JWELoaderFactory as JWELoaderFactoryAlias;
+use PHPUnit\Framework\Attributes\Test;
+use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * @internal
+ */
+final class JWECollectorTest extends WebTestCase
+{
+    #[Test]
+    public function aJWEBuilderCanBeCollectedWithoutACompressionMethodManager(): void
+    {
+        static::ensureKernelShutdown();
+        $client = static::createClient();
+        $container = $client->getContainer();
+        static::assertInstanceOf(ContainerInterface::class, $container);
+
+        $jweFactory = $container->get(JWEBuilderFactoryService::class);
+        static::assertInstanceOf(JWEBuilderFactoryService::class, $jweFactory);
+
+        $jweBuilder = $jweFactory->create(['RSA1_5', 'A256GCM']);
+
+        $jweCollector = new JWECollector();
+        $jweCollector->addJWEBuilder('builder2', $jweBuilder);
+
+        $data = [];
+        $jweCollector->collect($data, new Request(), new Response());
+
+        static::assertArrayHasKey('jwe', $data);
+        static::assertArrayNotHasKey('compression_methods', $data['jwe']);
+        static::assertArrayHasKey('jwe_builders', $data['jwe']);
+        static::assertArrayHasKey('builder2', $data['jwe']['jwe_builders']);
+    }
+
+    #[Test]
+    public function aJWEDecrypterCanBeCollectedWithoutACompressionMethodManager(): void
+    {
+        static::ensureKernelShutdown();
+        $client = static::createClient();
+        $container = $client->getContainer();
+        static::assertInstanceOf(ContainerInterface::class, $container);
+
+        $jweDecrypterFactory = $container->get(JWEDecrypterFactoryService::class);
+        static::assertInstanceOf(JWEDecrypterFactoryService::class, $jweDecrypterFactory);
+
+        $jweDecrypter = $jweDecrypterFactory->create(['RSA1_5', 'A256GCM']);
+
+        $jweCollector = new JWECollector();
+        $jweCollector->addJWEDecrypter('decrypter2', $jweDecrypter);
+
+        $data = [];
+        $jweCollector->collect($data, new Request(), new Response());
+
+        static::assertArrayHasKey('jwe', $data);
+        static::assertArrayNotHasKey('compression_methods', $data['jwe']);
+
+        static::assertArrayHasKey('jwe_decrypters', $data['jwe']);
+        static::assertArrayHasKey('decrypter2', $data['jwe']['jwe_decrypters']);
+    }
+
+    #[Test]
+    public function aJWELoaderCanBeCollectedWithoutACompressionMethodManager(): void
+    {
+        static::ensureKernelShutdown();
+        $client = static::createClient();
+        $container = $client->getContainer();
+        static::assertInstanceOf(ContainerInterface::class, $container);
+
+        $jweLoaderFactory = $container->get(JWELoaderFactoryAlias::class);
+        static::assertInstanceOf(JWELoaderFactoryAlias::class, $jweLoaderFactory);
+
+        $jweLoader = $jweLoaderFactory->create(['jwe_compact'], ['RSA1_5', 'A256GCM']);
+
+        $jweCollector = new JWECollector();
+        $jweCollector->addJWELoader('loader2', $jweLoader);
+
+        $data = [];
+        $jweCollector->collect($data, new Request(), new Response());
+
+        static::assertArrayHasKey('jwe', $data);
+        static::assertArrayNotHasKey('compression_methods', $data['jwe']);
+        static::assertArrayHasKey('jwe_loaders', $data['jwe']);
+        static::assertArrayHasKey('loader2', $data['jwe']['jwe_loaders']);
+    }
+}