Probar lo que una acción rechaza
Traducción automática
Esta página se tradujo automáticamente del inglés y todavía no la revisó un hablante nativo; las correcciones son bienvenidas en GitHub. Si algo no coincide, vale el original en inglés.
Tarea: demostrar que un formulario rechaza lo que debe — un campo que rompe su regla, un valor que el negocio no permite — y que no se escribe nada cuando lo hace.
Un registro con dos tipos de rechazo: las reglas de los q:param (verificadas antes de que la acción se ejecute) y una regla de negocio en la propia acción (la dirección ya es de un miembro):
# Recipe: testing what an action refuses — field rules and a business rule.
paths:
components: ./components
migrations: ./migrations
datasources:
db:
driver: sqlite
database: ./data/signup.dbCREATE TABLE members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
INSERT INTO members (name, email) VALUES ('Ana', 'ana@example.com');<q:component name="Signup">
<q:action name="join" method="POST">
<q:param name="name" required="true" minlength="2" />
<q:param name="email" type="email" required="true" />
<q:query name="taken" datasource="db">
SELECT id FROM members WHERE email = :email
<q:param name="email" value="{email}" type="string" />
</q:query>
<q:if condition="taken_result.recordCount > 0">
<q:redirect url="/" flash="{email} is already a member." flashType="error" />
</q:if>
<q:query name="added" datasource="db">
INSERT INTO members (name, email) VALUES (:name, :email)
<q:param name="name" value="{name}" type="string" />
<q:param name="email" value="{email}" type="string" />
</q:query>
<q:redirect url="/" flash="Welcome, {name}!" />
</q:action>
<h1>Join</h1>
<q:if condition="flash"><p class="flash-{flashType}">{flash}</p></q:if>
<form method="POST" action="/?action=join">
<input name="name" />
<input name="email" type="email" />
<button>Join</button>
</form>
</q:component>error="name" verifica el campo en el que se rechazó el envío, y message= el texto que se muestra junto a él. Un rechazo que decide la propia acción es una redirección con un mensaje flash, que se verifica con flash=. table= con count= demuestra que no se escribió nada:
<q:test name="a short name is refused on its field, with the rule's message" page="/">
<test:submit action="join" name="A" email="bia@example.com" />
<test:expect error="name" message="Must be at least 2 characters" />
<test:expect table="members" count="0" where="email = 'bia@example.com'" />
</q:test>
<q:test name="an address that is not an e-mail is refused on its field" page="/">
<test:submit action="join" name="Bia" email="bia-at-example" />
<test:expect error="email" />
<test:expect table="members" count="1" />
</q:test>
<q:test name="an address that is already a member is refused with a flash" page="/">
<test:submit action="join" name="Ana Again" email="ana@example.com" />
<test:expect redirect="/" flash="ana@example.com is already a member." />
<test:expect table="members" count="1" />
</q:test>
<q:test name="a new member is welcomed" page="/">
<test:submit action="join" name="Bia" email="bia@example.com" />
<test:expect redirect="/" flash="Welcome, Bia!" />
<test:expect table="members" count="1" where="email = 'bia@example.com'" />
</q:test>tests/signup.test.q
PASS a short name is refused on its field, with the rule's message
PASS an address that is not an e-mail is refused on its field
PASS an address that is already a member is refused with a flash
PASS a new member is welcomed
4 passed, 0 failedLas reglas que acepta un q:param (required, minlength, type="email", enum…) están en Actions & Forms (en inglés).
Probado: esta página importa los archivos de examples/cookbook/testing/action-errors/, y el resultado de arriba es el informe de ejecutarlos.