From 9fc64c8828a088f4cc56741adbf9eee60f790b3d Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Wed, 3 Jun 2020 13:41:19 +0200 Subject: [PATCH] feat(cypress): add "match" custom assertion for subject, body, adresses, and headers (#9) --- README.md | 35 +++++++++++++-- src/Bridge/Cypress/support/assertions.js | 54 ++++++++++++++++++++++++ tests/Bridge/Cypress/specs/email.spec.js | 19 +++++++++ 3 files changed, 104 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fe54d21..a715b37 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,9 @@ expect(messageEvents.events[0]).to.have.subject.not.equals('Foo'); expect(messageEvents.events[0]).to.have.subject.contains('Hello world!'); expect(messageEvents.events[0]).to.have.subject.not.contains('Foo'); + +expect(messageEvents.events[0]).to.have.subject.match(/^Hello /); +expect(messageEvents.events[0]).to.have.subject.not.match(/^Goodbye/); ``` ##### `body(type)` @@ -241,15 +244,25 @@ expect(messageEvents.events[0]).to.have.subject.not.contains('Foo'); Assert email's text or HTML body. ```js +// Body "text" expect(messageEvents.events[0]).to.have.body('text').equal('Hello world!'); -expect(messageEvents.events[0]).to.have.body('text').contains('Hello'); expect(messageEvents.events[0]).to.have.body('text').not.equal('Foo'); + +expect(messageEvents.events[0]).to.have.body('text').contains('Hello'); expect(messageEvents.events[0]).to.have.body('text').not.contains('Foo'); +expect(messageEvents.events[0]).to.have.body('text').match('[a-z]+'); +expect(messageEvents.events[0]).to.have.body('text').not.match('[a-z]+'); + +// Body "HTML" expect(messageEvents.events[0]).to.have.body('html').equal('

Hello world!

'); -expect(messageEvents.events[0]).to.have.body('html').contains('Hello world!'); expect(messageEvents.events[0]).to.have.body('html').not.equal('Foo'); + +expect(messageEvents.events[0]).to.have.body('html').contains('Hello world!'); expect(messageEvents.events[0]).to.have.body('html').not.contains('Foo'); + +expect(messageEvents.events[0]).to.have.body('html').match('[a-z]+'); +expect(messageEvents.events[0]).to.have.body('html').not.match('[a-z]+'); ``` ##### `header(name)` @@ -258,8 +271,17 @@ Assert email's headers. ```js expect(messageEvents.events[0]).to.have.header('From'); -expect(messageEvents.events[0]).to.have.header('From').eq('symfony-mailer-testing@example.com'); expect(messageEvents.events[0]).to.not.have.header('Foobar'); + +expect(messageEvents.events[0]).to.have.header('From').equal('symfony-mailer-testing@example.com'); +expect(messageEvents.events[0]).to.have.header('From').not.equal('foo@example.com'); + +expect(messageEvents.events[0]) + .to.have.header('From') + .match(/[a-z]+@example.com/); +expect(messageEvents.events[0]) + .to.have.header('From') + .not.match(/[a-z0-9]+@example.com/); ``` ##### `address(type)` @@ -268,6 +290,11 @@ Assert email's address. ```js expect(messageEvents.events[0]).to.have.address('From'); -expect(messageEvents.events[0]).to.have.address('From').eq('symfony-mailer-testing@example.com'); expect(messageEvents.events[0]).to.not.have.address('Foobar'); + +expect(messageEvents.events[0]).to.have.address('From').equal('symfony-mailer-testing@example.com'); +expect(messageEvents.events[0]).to.have.address('From').not.equal('foo@example.com'); + +expect(messageEvents.events[0]).to.have.address('From').match(/[a-z]+@example.com/); +expect(messageEvents.events[0]).to.have.address('From').not.match(/[a-z0-9]+@example.com); ``` diff --git a/src/Bridge/Cypress/support/assertions.js b/src/Bridge/Cypress/support/assertions.js index 22d7a64..95f8d29 100644 --- a/src/Bridge/Cypress/support/assertions.js +++ b/src/Bridge/Cypress/support/assertions.js @@ -291,6 +291,60 @@ function assertions(_chai, utils) { Assertion.overwriteChainableMethod('includes', assertInclude, assertIncludeChainingBehavior); Assertion.overwriteChainableMethod('contain', assertInclude, assertIncludeChainingBehavior); Assertion.overwriteChainableMethod('contains', assertInclude, assertIncludeChainingBehavior); + + function assertMatch(_super) { + return function (...args) { + /** @var {SymfonyMailerTesting.MessageEvent} messageEvent */ + const messageEvent = utils.flag(this, 'object'); + + if (!isMessageEvent(messageEvent)) { + _super.apply(this, args); + return; + } + + const regex = args[0]; + const subject = utils.flag(this, 'subject'); + const body = utils.flag(this, 'body'); + const headerName = utils.flag(this, 'header'); + + if (subject) { + this.assert( + regex.exec(messageEvent.message.subject), + `expected email subject to match ${regex}`, + `expected email subject to not match ${regex}` + ); + return; + } + + if (body) { + const bodyContent = messageEvent.message[body].body; + + this.assert( + regex.exec(bodyContent || ''), + `expected email ${body} body to match ${regex}`, + `expected email ${body} body to not match ${regex}` + ); + return; + } + + if (headerName) { + const headerFiltered = filterHeader(messageEvent, { name: headerName }); + + let messageSuccess = `expected email to have header "${headerName}" matching ${regex}`; + let messageFailure = `expected email to have header "${headerName}" not matching ${regex}`; + + if (utils.flag(this, 'forAddress')) { + messageSuccess = `expected email to have address "${headerName}" to matching ${regex}`; + messageFailure = `expected email to have address "${headerName}" to not matching ${regex}`; + } + + this.assert(headerFiltered && regex.exec(headerFiltered.body), messageSuccess, messageFailure); + } + }; + } + + Assertion.overwriteMethod('match', assertMatch); + Assertion.overwriteMethod('matches', assertMatch); } module.exports = assertions; diff --git a/tests/Bridge/Cypress/specs/email.spec.js b/tests/Bridge/Cypress/specs/email.spec.js index 54bb929..7e1959b 100644 --- a/tests/Bridge/Cypress/specs/email.spec.js +++ b/tests/Bridge/Cypress/specs/email.spec.js @@ -63,8 +63,14 @@ describe('I test an email', function () { sendEmail({ subject: 'Hello world!' }); cy.getMessageEvents().then((messageEvents) => { + expect(messageEvents.events[0]).to.have.subject.equal('Hello world!'); + expect(messageEvents.events[0]).to.have.subject.not.equal('Foo'); + expect(messageEvents.events[0]).to.have.subject.contains('Hello world!'); expect(messageEvents.events[0]).to.have.subject.not.contains('Foo'); + + expect(messageEvents.events[0]).to.have.subject.match(/^Hello/); + expect(messageEvents.events[0]).to.have.subject.not.match(/^Bye/); }); }); @@ -80,11 +86,15 @@ describe('I test an email', function () { expect(messageEvents.events[0]).to.have.body('text').not.eq('Foo bar'); expect(messageEvents.events[0]).to.have.body('text').contains('text'); expect(messageEvents.events[0]).to.have.body('text').not.contains('Foo bar'); + expect(messageEvents.events[0]).to.have.body('text').match(/text$/); + expect(messageEvents.events[0]).to.have.body('text').not.match(/foo/); expect(messageEvents.events[0]).to.have.body('html').eq('My HTML'); expect(messageEvents.events[0]).to.have.body('html').not.eq('Foo bar'); expect(messageEvents.events[0]).to.have.body('html').contains('HTML'); expect(messageEvents.events[0]).to.have.body('html').not.contains('bar'); + expect(messageEvents.events[0]).to.have.body('html').match(/HTML/); + expect(messageEvents.events[0]).to.have.body('html').not.match(/text/); }); }); @@ -96,8 +106,14 @@ describe('I test an email', function () { expect(messageEvents.events[0]).to.have.header('from'); expect(messageEvents.events[0]).to.have.header('From').eq('symfony-mailer-testing@example.com'); expect(messageEvents.events[0]).to.have.header('From').contains('symfony-mailer-testing@example.com'); + expect(messageEvents.events[0]) + .to.have.header('From') + .matches(/[a-z-]+@example.com/); expect(messageEvents.events[0]).to.not.have.header('Foobar'); + expect(messageEvents.events[0]) + .to.have.header('From') + .not.matches(/[0-9-]+@example.com/); }); }); @@ -108,6 +124,9 @@ describe('I test an email', function () { expect(messageEvents.events[0]).to.have.address('From').eq('symfony-mailer-testing@example.com'); expect(messageEvents.events[0]).to.have.address('From').contains('symfony-mailer-testing@example.com'); expect(messageEvents.events[0]).to.have.address('To').contains('john@example.com'); + expect(messageEvents.events[0]) + .to.have.header('From') + .matches(/[a-z-]+@example.com/); }); });