From b583b02fb4276e5c5d69477844cab760e9b58e04 Mon Sep 17 00:00:00 2001 From: mattwr18 Date: Wed, 11 Dec 2019 17:57:25 +0100 Subject: [PATCH] Update createPasswordReset helper function - the test is broken, can you have a look @roschaefer?? - I tried to get it to work, but it's complicated with multiple promises... I'm ok if we remove this test as well as it's only testing that normalizeEmail works as it's supposed to... but that hopefully is tested on the side of the validator library --- .../resolvers/helpers/createPasswordReset.js | 39 +++++++++++-------- .../helpers/createPasswordReset.spec.js | 12 +++--- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/backend/src/schema/resolvers/helpers/createPasswordReset.js b/backend/src/schema/resolvers/helpers/createPasswordReset.js index 41214b501..dec55c893 100644 --- a/backend/src/schema/resolvers/helpers/createPasswordReset.js +++ b/backend/src/schema/resolvers/helpers/createPasswordReset.js @@ -5,24 +5,29 @@ export default async function createPasswordReset(options) { const normalizedEmail = normalizeEmail(email) const session = driver.session() try { - const cypher = ` - MATCH (u:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email:$email}) - CREATE(pr:PasswordReset {nonce: $nonce, issuedAt: datetime($issuedAt), usedAt: NULL}) - MERGE (u)-[:REQUESTED]->(pr) - RETURN e, pr, u - ` - const transactionRes = await session.run(cypher, { - issuedAt: issuedAt.toISOString(), - nonce, - email: normalizedEmail, + const createPasswordResetTxPromise = session.writeTransaction(async transaction => { + const createPasswordResetTransactionResponse = await transaction.run( + ` + MATCH (user:User)-[:PRIMARY_EMAIL]->(email:EmailAddress {email:$email}) + CREATE(passwordReset:PasswordReset {nonce: $nonce, issuedAt: datetime($issuedAt), usedAt: NULL}) + MERGE (user)-[:REQUESTED]->(passwordReset) + RETURN email, passwordReset, user + `, + { + issuedAt: issuedAt.toISOString(), + nonce, + email: normalizedEmail, + }, + ) + return createPasswordResetTransactionResponse.records.map(record => { + const { email } = record.get('email').properties + const { nonce } = record.get('passwordReset').properties + const { name } = record.get('user').properties + return { email, nonce, name } + }) }) - const records = transactionRes.records.map(record => { - const { email } = record.get('e').properties - const { nonce } = record.get('pr').properties - const { name } = record.get('u').properties - return { email, nonce, name } - }) - return records[0] || {} + const [records] = await createPasswordResetTxPromise + return records || {} } finally { session.close() } diff --git a/backend/src/schema/resolvers/helpers/createPasswordReset.spec.js b/backend/src/schema/resolvers/helpers/createPasswordReset.spec.js index a566e225a..5f673f028 100644 --- a/backend/src/schema/resolvers/helpers/createPasswordReset.spec.js +++ b/backend/src/schema/resolvers/helpers/createPasswordReset.spec.js @@ -10,10 +10,12 @@ describe('createPasswordReset', () => { beforeEach(() => { mockSession = { close() {}, - run: jest.fn().mockReturnValue({ - records: { - map: jest.fn(() => []), - }, + writeTransaction: jest.fn().mockReturnValue({ + run: jest.fn().mockReturnValue({ + records: { + map: jest.fn(() => []), + }, + }), }), } driver = { session: () => mockSession } @@ -22,7 +24,7 @@ describe('createPasswordReset', () => { it('lowercases email address', async () => { const email = 'stRaNGeCaSiNG@ExAmplE.ORG' await createPasswordReset({ driver, email, issuedAt, nonce }) - expect(mockSession.run.mock.calls).toEqual([ + expect(mockSession.writeTransaction.run.mock.calls).toEqual([ [ expect.any(String), expect.objectContaining({