Skip to content

Commit

Permalink
feat(cypress): add "match" custom assertion for subject, body, adress…
Browse files Browse the repository at this point in the history
…es, and headers (#9)
  • Loading branch information
Kocal authored Jun 3, 2020
1 parent 2fdbe52 commit 9fc64c8
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 4 deletions.
35 changes: 31 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -234,22 +234,35 @@ 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)`

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('<h1>Hello world!</h1>');
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)`
Expand All @@ -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('[email protected]');
expect(messageEvents.events[0]).to.not.have.header('Foobar');

expect(messageEvents.events[0]).to.have.header('From').equal('[email protected]');
expect(messageEvents.events[0]).to.have.header('From').not.equal('[email protected]');

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)`
Expand All @@ -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('[email protected]');
expect(messageEvents.events[0]).to.not.have.address('Foobar');

expect(messageEvents.events[0]).to.have.address('From').equal('[email protected]');
expect(messageEvents.events[0]).to.have.address('From').not.equal('[email protected]');

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);
```
54 changes: 54 additions & 0 deletions src/Bridge/Cypress/support/assertions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
19 changes: 19 additions & 0 deletions tests/Bridge/Cypress/specs/email.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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/);
});
});

Expand All @@ -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('<b>My HTML</b>');
expect(messageEvents.events[0]).to.have.body('html').not.eq('<b>Foo bar</b>');
expect(messageEvents.events[0]).to.have.body('html').contains('HTML</b>');
expect(messageEvents.events[0]).to.have.body('html').not.contains('bar</b>');
expect(messageEvents.events[0]).to.have.body('html').match(/HTML/);
expect(messageEvents.events[0]).to.have.body('html').not.match(/text/);
});
});

Expand All @@ -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('[email protected]');
expect(messageEvents.events[0]).to.have.header('From').contains('[email protected]');
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/);
});
});

Expand All @@ -108,6 +124,9 @@ describe('I test an email', function () {
expect(messageEvents.events[0]).to.have.address('From').eq('[email protected]');
expect(messageEvents.events[0]).to.have.address('From').contains('[email protected]');
expect(messageEvents.events[0]).to.have.address('To').contains('[email protected]');
expect(messageEvents.events[0])
.to.have.header('From')
.matches(/[a-z-]+@example.com/);
});
});

Expand Down

0 comments on commit 9fc64c8

Please sign in to comment.