From 2438e1d7c3d22379d4447c0281a76034d22e7050 Mon Sep 17 00:00:00 2001
From: Vitor George <vitor.george@gmail.com>
Date: Thu, 31 Oct 2019 19:29:25 +0000
Subject: [PATCH 1/2] Move reset database function to its own file.

---
 test/test--index.js    | 11 ++---------
 test/utils/reset-db.js | 13 +++++++++++++
 2 files changed, 15 insertions(+), 9 deletions(-)
 create mode 100644 test/utils/reset-db.js

diff --git a/test/test--index.js b/test/test--index.js
index 7207749..3d79800 100755
--- a/test/test--index.js
+++ b/test/test--index.js
@@ -1,9 +1,8 @@
 import config from 'config';
 import { expect } from 'chai';
 import startServer from '../app';
-import db from '../app/services/db';
 import logger from '../app/services/logger';
-import { clearMediaStore } from '../app/services/media-store';
+import resetDb from '../test/utils/reset-db';
 import Client from './utils/http-client';
 
 const port = config.get('port');
@@ -12,13 +11,7 @@ global.apiUrl = apiUrl;
 
 describe('Observe API', function () {
   before(async function () {
-    logger.info('Clearing database...');
-    await db.schema.dropTableIfExists('knex_migrations');
-    await db.schema.dropTableIfExists('users');
-    await db.schema.dropTableIfExists('traces');
-    await db.schema.dropTableIfExists('photos');
-    await db.migrate.latest();
-    await clearMediaStore();
+    await resetDb();
 
     logger.info('Starting server...');
     global.server = await startServer();
diff --git a/test/utils/reset-db.js b/test/utils/reset-db.js
new file mode 100644
index 0000000..94e7a1f
--- /dev/null
+++ b/test/utils/reset-db.js
@@ -0,0 +1,13 @@
+import db from '../../app/services/db';
+import logger from '../../app/services/logger';
+import { clearMediaStore } from '../../app/services/media-store';
+
+export default async function resetDb () {
+  logger.info('Clearing database...');
+  await db.schema.dropTableIfExists('knex_migrations');
+  await db.schema.dropTableIfExists('users');
+  await db.schema.dropTableIfExists('traces');
+  await db.schema.dropTableIfExists('photos');
+  await db.migrate.latest();
+  await clearMediaStore();
+}

From 9bf505de45e864cdb2a8bdd59163f0c3de9d9f2f Mon Sep 17 00:00:00 2001
From: Vitor George <vitor.george@gmail.com>
Date: Thu, 31 Oct 2019 19:30:52 +0000
Subject: [PATCH 2/2] Add populate-dev-db task.

---
 README.md                  |  7 +++++++
 app/utils.js               |  8 ++++++++
 package.json               |  1 +
 test/utils/mock-factory.js |  9 +--------
 utils/populate-db.js       | 38 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 55 insertions(+), 8 deletions(-)
 create mode 100644 utils/populate-db.js

diff --git a/README.md b/README.md
index 35c9b59..6ab080d 100755
--- a/README.md
+++ b/README.md
@@ -40,12 +40,19 @@ Open a new terminal and migrate the database:
 
     npm run migrate-dev-db
 
+If your with to populate it with mock data, run:
+
+    npm run populate-dev-db
+
+Please consider that the last step will **wipe any previous data** from the development database.
+
 Start development server with changes monitoring:
 
     npm run dev
 
 Access the service at [localhost:3000](http://localhost:3000)
 
+
 When finished, go back to the first terminal session and kill the database container with Ctrl+C.
 
 ### Testing
diff --git a/app/utils.js b/app/utils.js
index 2c12a63..4112d80 100644
--- a/app/utils.js
+++ b/app/utils.js
@@ -10,3 +10,11 @@ export function appUrl () {
 export function mediaUrl () {
   return `${appUrl()}/media`;
 }
+
+/**
+ * Generate random integer number up to "max" value.
+ * @param {integer} max
+ */
+export function getRandomInt (max) {
+  return Math.floor(Math.random() * Math.floor(max));
+}
diff --git a/package.json b/package.json
index bcd3115..2136794 100644
--- a/package.json
+++ b/package.json
@@ -21,6 +21,7 @@
     "lint": "node_modules/.bin/eslint app/ test/ --ext .js",
     "test": "NODE_ENV=test mocha -r esm test/test--index.js",
     "start-dev-db": "docker-compose -f docker-compose-dev.yml up",
+    "populate-dev-db": "NODE_ENV=development node -r esm -e 'require(\"./utils/populate-db.js\").populateDb()'",
     "start-test-db": "docker-compose -f docker-compose-test.yml up",
     "migrate-dev-db": "NODE_ENV=development node_modules/.bin/knex migrate:latest",
     "test-lint": "npm run lint && npm run test",
diff --git a/test/utils/mock-factory.js b/test/utils/mock-factory.js
index 36065b1..44226a8 100644
--- a/test/utils/mock-factory.js
+++ b/test/utils/mock-factory.js
@@ -2,14 +2,7 @@ import users from '../../app/models/users';
 import traces from '../../app/models/traces';
 import validTraceJson from '../fixtures/valid-trace.json';
 import { createPhoto } from '../../app/models/photos';
-
-/**
- * Generate random integer number up to "max" value.
- * @param {integer} max
- */
-function getRandomInt (max) {
-  return Math.floor(Math.random() * Math.floor(max));
-}
+import { getRandomInt } from '../../app/utils';
 
 /**
  * Factory to create mock users at the database.
diff --git a/utils/populate-db.js b/utils/populate-db.js
new file mode 100644
index 0000000..84f28e2
--- /dev/null
+++ b/utils/populate-db.js
@@ -0,0 +1,38 @@
+import resetDb from '../test/utils/reset-db';
+import { getRandomInt } from '../app/utils';
+import logger from '../app/services/logger';
+import {
+  createMockUser,
+  createMockTrace,
+  createMockPhoto
+} from '../test/utils/mock-factory';
+
+export async function populateDb () {
+  await resetDb();
+
+  logger.info(`Populating...`);
+
+  const numberOfUsers = 5;
+
+  // For each user
+  for (let u = 0; u < numberOfUsers; u++) {
+    const user = await createMockUser();
+
+    // Generate up to 25 traces
+    const numberOfTraces = getRandomInt(20) + 5;
+    for (let t = 0; t < numberOfTraces; t++) {
+      await createMockTrace(user.osmId);
+    }
+
+    // Generate up to 25 photos
+    const numberOfPhotos = getRandomInt(20) + 5;
+    for (let p = 0; p < numberOfPhotos; p++) {
+      await createMockPhoto(user.osmId);
+    }
+
+    logger.info(
+      `  Added user ${user.osmDisplayName} with ${numberOfTraces} traces and ${numberOfPhotos} photos.`
+    );
+  }
+  process.exit();
+}