Install
$ agentstack add skill-jeffsenso-prestashop-skills-create-behat-context ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
create-behat-context
Read @.ai/Component/Behat/CONTEXT.md for conventions (base class, entity references, stateless steps, bus access).
1. Context class
Create tests/Integration/Behaviour/Features/Context/Domain/{Domain}/{Domain}FeatureContext.php:
- Extend
AbstractDomainFeatureContext - Implement step definitions as methods with
@Given,@When,@Thenannotations - Use
$this->getCommandBus()->handle(...)for write operations - Use
$this->getQueryBus()->handle(...)for read/verification - Use
$this->referenceToId($reference)to resolve string references to integer IDs - After creating an entity, store reference:
$this->getSharedStorage()->set($reference, $newId)
Reference: tests/Integration/Behaviour/Features/Context/Domain/Tax/TaxFeatureContext.php (simple)
2. Step implementation patterns
Action steps (@When)
/**
* @When I add a {domain} :reference with following properties:
*/
public function iAddDomainWithProperties(string $reference, TableNode $table): void
{
$data = $this->localizeByRows($table);
$command = new Add{Domain}Command(
$data['name'],
(bool) $data['active'],
);
$id = $this->getCommandBus()->handle($command);
$this->getSharedStorage()->set($reference, $id->getValue());
}
Assertion steps (@Then) — must be stateless
/**
* @Then {domain} :reference should have the following properties:
*/
public function domainShouldHaveProperties(string $reference, TableNode $table): void
{
$id = $this->referenceToId($reference);
$result = $this->getQueryBus()->handle(new Get{Domain}ForEditing($id));
// Assert each field independently
}
The assertion loads the entity fresh from the database — it does NOT rely on state from a previous step.
Error steps (capture-then-assert pattern)
Errors are tested in two paired steps: the @When step catches the domain exception and stores it via $this->setLastException(...); the next @Then step asserts the stored exception via $this->assertLastErrorIs(...).
/**
* @When I add a {domain} :reference with invalid name
*/
public function addWithInvalidName(string $reference): void
{
try {
$this->getCommandBus()->handle(new Add{Domain}Command(''));
} catch ({Domain}ConstraintException $e) {
$this->setLastException($e);
}
}
/**
* @Then I should get error that {domain} name is invalid
*/
public function assertLastErrorIsInvalidName(): void
{
$this->assertLastErrorIs(
{Domain}ConstraintException::class,
{Domain}ConstraintException::INVALID_NAME, // optional error code
);
}
Two safety nets enforced by CommonFeatureContext:
- A captured exception must be asserted by a following step. If the next step ends without calling
assertLastErrorIs, thecheckExpectedExceptionAfterStep@AfterStephook re-throws it as aRuntimeException— preventing a domain exception from being silently swallowed. cleanStoredExceptionsBeforeScenario(@BeforeScenario) clears any leftover exception so scenarios don't leak state into each other.
So: never try/catch and ignore — always pair the capture with an assertion in the very next step.
3. Registration in behat.yml
Open tests/Integration/Behaviour/behat.yml and add the context to the domain suite:
domain:
contexts:
- PrestaShop\Tests\Integration\Behaviour\Features\Context\Domain\{Domain}\{Domain}FeatureContext
Verify: php vendor/bin/behat --dry-run to confirm all steps are matched.
Rules
Conventions (stateless steps, referenceToId, deterministic steps, typed exceptions, error scenarios) are in [Behat/CONTEXT.md](../../CONTEXT.md). Skill-specific reminders:
- Use
referenceToId/referencesToIds— notgetSharedStorage()->get()directly - Check existing contexts for reusable steps before creating new ones
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: jeffsenso
- Source: jeffsenso/prestashop-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.