This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jan 27, 2026. It is now read-only.

Repository files navigation

PhdApiTestingBundle

🧰 Provides lightweight jwt authorization utilities for Api Testing in Symfony applications. In essence, this package integrates Lexik JWT Authentication Bundle into your Api Test Cases.

Build StatusCodecovPsalm coveragePsalm levelTotal DownloadsLicence

Quick Start

Installation 📥

  1. Install via composer

    composer require --dev phphd/api-testing
  2. Enable the bundle in the bundles.php

    PhPhD\ApiTesting\Bundle\PhdApiTestingBundle::class => ['test' => true],

Configuration ⚒️

Create phd_api_testing.yaml configuration file under config/packages/test directory. It's necessary to specify service id of application user provider here. If you have only one authenticated user entity (hence, one provider), use current default configuration.

phd_api_testing:
jwt_authenticators:
- name: defaultuser_provider: security.user_providers

Usage 🚀

In your Api Test class use JwtLoginTrait and login method to handle authentication:

usePhPhD\ApiTesting\Jwt\JwtLoginTrait;
finalclass ExampleProtectedApiTest extends ApiTestCase
{
use JwtLoginTrait;
// ...publicfunctiontestAccessFeatureWithoutPassword(): void
{
$token = $this->login('username');
$this->client->request('GET', '/api/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}
}

In this example, login is used to generate jwt token for username user so that api request will be sent on his behalf.

Advanced Configuration ⚙️

Multiple Authenticators

It is possible to use multiple authenticators for your specific needs. For instance if you have admin panel alongside your main authenticated application, you may want to use the dedicated authenticator.

In essence, if you're utilizing security.user_providers, additional configuration is typically unnecessary, since security.user_providers acts as a chain user provider, meaning that first found user from any subordinate providers will be used.

Nonetheless, in case of conflicting usernames or any other specific reason, you may register an additional authenticator in the same configuration file by different name:

phd_api_testing:
jwt_authenticators:
- name: adminuser_provider: security.user.provider.concrete.api_admin_user_provider

In this config, api_admin_user_provider is the name of user provider from security.yaml and admin - just an alias for our usage in tests.

Having registered authenticator, we may use its alias as a second parameter of login method:

publicfunctiontestDedicatedAdminAuthenticator(): void
{
$token = $this->login('admin@test.com', authenticator: 'admin');
$this->client->request('GET', '/api/admin/protected-route', [
'auth_bearer' => $token,
]);
self::assertResponseStatusCodeSame(200);
}

About

JWT Authentication for API testing in Symfony applications

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages