From 14756f36dba954272ada793738b072ec2e84b05e Mon Sep 17 00:00:00 2001 From: Wallef Reis Borges Date: Thu, 28 Nov 2019 21:47:35 +0000 Subject: [PATCH 1/3] Showing user's name on answers Created a table join in order to access the user's name. Added a testData method in order to access the user over the in memory db. TestData creates the users table and adds an user to it, in order for me to have access to it on my unit tests. The getAnswersByQuestion method is still fully tested and working. User's name now is displayed on the front-end --- core/models/answer.js | 8 +++++++- core/views/answer.hbs | 2 +- unit test/answer.spec.js | 8 +++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/core/models/answer.js b/core/models/answer.js index d53bfe4..20f250a 100644 --- a/core/models/answer.js +++ b/core/models/answer.js @@ -28,11 +28,17 @@ module.exports = class Answer { async getAnswersByQuestion(id) { try { - const sql = `SELECT * FROM answers WHERE question_id = "${id}";` + const sql = `SELECT answers.*, users.name AS user_name FROM answers + INNER JOIN users ON users.id = answers.user_id WHERE question_id = "${id}";` const answers = await this.db.all(sql) return answers } catch (err) { throw err } } + + async __testData() { + await this.db.run(table.createUsersTable()) + await this.db.run('INSERT INTO users(name, username, password) VALUES("Wallef", "username", "password");') + } } diff --git a/core/views/answer.hbs b/core/views/answer.hbs index 601ec3a..e12c808 100644 --- a/core/views/answer.hbs +++ b/core/views/answer.hbs @@ -18,7 +18,7 @@

{{ body }}

{{ date }}

-

{{ user_id }}

+

{{ user_name }}


{{/each}} diff --git a/unit test/answer.spec.js b/unit test/answer.spec.js index 2422e01..15ec0bd 100644 --- a/unit test/answer.spec.js +++ b/unit test/answer.spec.js @@ -43,13 +43,14 @@ describe('Create()', () => { describe('getAnswersByQuestion()', () => { test('Get all answers from a question', async done => { - expect.assertions(4) + expect.assertions(5) //Arrange const answer = await new Answer() + await answer.__testData() const request = { body: {body: 'Getting Answers'}, parameters: {question_id: 3}, - session: {user: {id: 2}} + session: {user: {id: 1}} } // Act await answer.createAnswer(request, '21/11/2019') @@ -58,7 +59,8 @@ describe('getAnswersByQuestion()', () => { expect(data[0].body).toBe('Getting Answers') expect(data[0].date).toBe('21/11/2019') expect(data[0].question_id).toBe(3) - expect(data[0].user_id).toBe(2) + expect(data[0].user_id).toBe(1) + expect(data[0].user_name).toBe('Wallef') done() }) }) From 6e8a71ed55e1e1635a40c36acf55ff564c357802 Mon Sep 17 00:00:00 2001 From: Wallef Reis Borges Date: Thu, 28 Nov 2019 22:36:38 +0000 Subject: [PATCH 2/3] 100% test coverage The getAnswersByQuestion method wasn't fully tested. It was missing bad data tests. It is now 100% tested --- core/models/answer.js | 1 + unit test/answer.spec.js | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/models/answer.js b/core/models/answer.js index 20f250a..57e17d6 100644 --- a/core/models/answer.js +++ b/core/models/answer.js @@ -31,6 +31,7 @@ module.exports = class Answer { const sql = `SELECT answers.*, users.name AS user_name FROM answers INNER JOIN users ON users.id = answers.user_id WHERE question_id = "${id}";` const answers = await this.db.all(sql) + if (!answers.length) throw new Error('Answers not found!') return answers } catch (err) { throw err diff --git a/unit test/answer.spec.js b/unit test/answer.spec.js index 15ec0bd..5a60fab 100644 --- a/unit test/answer.spec.js +++ b/unit test/answer.spec.js @@ -28,14 +28,14 @@ describe('Create()', () => { test('Empty answer', async done => { expect.assertions(1) - //Arrange + // Arrange const answer = await new Answer() const request = { body: {body: ''}, parameters: {question_id: 1}, session: {user: {id: 1}} } - //Act & Assert + // Act & Assert await expect(answer.createAnswer(request, '21/11/2019')).rejects.toEqual(Error('Answer cannot be empty!')) done() }) @@ -44,7 +44,7 @@ describe('Create()', () => { describe('getAnswersByQuestion()', () => { test('Get all answers from a question', async done => { expect.assertions(5) - //Arrange + // Arrange const answer = await new Answer() await answer.__testData() const request = { @@ -63,4 +63,21 @@ describe('getAnswersByQuestion()', () => { expect(data[0].user_name).toBe('Wallef') done() }) + + test('Bad data', async done => { + expect.assertions(1) + // Arrange + const answer = await new Answer() + await answer.__testData() + const request = { + body: {body: 'Getting Answers'}, + parameters: {question_id: 3}, + session: {user: {id: 1}} + } + // Act + await answer.createAnswer(request, '21/11/2019') + // Assert + await expect(answer.getAnswersByQuestion(8)).rejects.toEqual(Error('Answers not found!')) + done() + }) }) From a2e725dcca3679f203ee4c7f8d87cfe94ae4be0c Mon Sep 17 00:00:00 2001 From: Wallef Reis Borges Date: Thu, 28 Nov 2019 23:05:38 +0000 Subject: [PATCH 3/3] Getting rid of thrown error on getAnswersByQuestion The method would throw an error when the results of the SQL query was empty. However it is possible for a question to have no answers Therefore this error was unecessary and would break the application --- core/models/answer.js | 13 ++++--------- unit test/answer.spec.js | 17 ----------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/core/models/answer.js b/core/models/answer.js index 57e17d6..6ee6847 100644 --- a/core/models/answer.js +++ b/core/models/answer.js @@ -27,15 +27,10 @@ module.exports = class Answer { } async getAnswersByQuestion(id) { - try { - const sql = `SELECT answers.*, users.name AS user_name FROM answers - INNER JOIN users ON users.id = answers.user_id WHERE question_id = "${id}";` - const answers = await this.db.all(sql) - if (!answers.length) throw new Error('Answers not found!') - return answers - } catch (err) { - throw err - } + const sql = `SELECT answers.*, users.name AS user_name FROM answers + INNER JOIN users ON users.id = answers.user_id WHERE question_id = "${id}";` + const answers = await this.db.all(sql) + return answers } async __testData() { diff --git a/unit test/answer.spec.js b/unit test/answer.spec.js index 5a60fab..460920b 100644 --- a/unit test/answer.spec.js +++ b/unit test/answer.spec.js @@ -63,21 +63,4 @@ describe('getAnswersByQuestion()', () => { expect(data[0].user_name).toBe('Wallef') done() }) - - test('Bad data', async done => { - expect.assertions(1) - // Arrange - const answer = await new Answer() - await answer.__testData() - const request = { - body: {body: 'Getting Answers'}, - parameters: {question_id: 3}, - session: {user: {id: 1}} - } - // Act - await answer.createAnswer(request, '21/11/2019') - // Assert - await expect(answer.getAnswersByQuestion(8)).rejects.toEqual(Error('Answers not found!')) - done() - }) })