Skip to content

Commit

Permalink
Remove seeding, change to passing the raw db rather than the adapter …
Browse files Browse the repository at this point in the history
…type
  • Loading branch information
stanlemon committed Sep 17, 2023
1 parent 50aa106 commit 5db7ba4
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 35 deletions.
10 changes: 5 additions & 5 deletions apps/template/app.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import {
createAppServer,
asyncJsonHandler as handler,
createDb,
LowDBUserDao,
} from "@stanlemon/server-with-auth";
import { v4 as uuid } from "uuid";

const dao = new LowDBUserDao();
export const db = dao.getDB();
export const db = createDb();
const dao = new LowDBUserDao(db);

db.data.items = db.data.items || [];

const app = createAppServer({
export const app = createAppServer({
webpack: "http://localhost:8080",
secure: ["/api/"],
dao,
Expand Down Expand Up @@ -37,5 +39,3 @@ app.delete(
return db.data.items;
})
);

export default app;
2 changes: 1 addition & 1 deletion apps/template/app.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @jest-environment node
*/
import request from "supertest";
import app, { db } from "./app.js";
import { app, db } from "./app.js";

describe("/app", () => {
afterEach(() => {
Expand Down
2 changes: 1 addition & 1 deletion apps/template/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@stanlemon/app-template",
"version": "0.3.0",
"version": "0.3.1",
"description": "A template for creating apps using the webdev package.",
"author": "Stan Lemon <[email protected]>",
"license": "MIT",
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions packages/server-with-auth/app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { createAppServer, asyncJsonHandler as handler } from "./src/index.js";
import LowDBUserDao from "./src/data/lowdb-user-dao.js";
import LowDBUserDao, { createDb } from "./src/data/lowdb-user-dao.js";

const dao = new LowDBUserDao();
const db = createDb();
const dao = new LowDBUserDao(db);

const app = createAppServer({
port: 3003,
Expand All @@ -24,5 +25,5 @@ app.get(
// Secure endpoint
app.get(
"/api/users",
handler(() => ({ users: dao.getDB().data.users }))
handler(() => ({ users: db.data.users }))
);
2 changes: 1 addition & 1 deletion packages/server-with-auth/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@stanlemon/server-with-auth",
"version": "0.2.0",
"version": "0.2.1",
"description": "A basic express web server setup with authentication baked in.",
"author": "Stan Lemon <[email protected]>",
"license": "MIT",
Expand Down
39 changes: 26 additions & 13 deletions packages/server-with-auth/src/data/lowdb-user-dao.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,40 @@ import { v4 as uuidv4 } from "uuid";
import bcrypt from "bcryptjs";
import UserDao from "./user-dao.js";

const DEFAULT_ADAPTER =
process.env.NODE_ENV === "test"
? new MemorySync()
: new JSONFileSync("./db.json");
export function createInMemoryDb() {
return new LowSync(new MemorySync(), {});
}

export function createJsonFileDb(filename = "./db.json") {
return new LowSync(new JSONFileSync(filename), {});
}

/**
* Create a database based on the environment.
* Test environment (NODE_ENV=test) will use {MemorySync}.
* @returns {LowSync} Database
*/
export function createDb() {
return process.env.NODE_ENV === "test"
? createInMemoryDb()
: createJsonFileDb();
}

export default class LowDBUserDao extends UserDao {
#db;

constructor(seeds = [], adapter = DEFAULT_ADAPTER) {
constructor(db = createDb()) {
super();

this.#db = new LowSync(adapter, { users: [] });
this.#db.read();

if (seeds.length > 0) {
seeds.forEach((user) => this.createUser(user));
if (!(db instanceof LowSync)) {
throw new Error("The db object must be of type LowSync.");
}
}

getDB() {
return this.#db;
this.#db = db;
this.#db.read();

// Default data, ensure that users is an array if it is not already
this.#db.data.users = db.data.users || [];
}

/** @inheritdoc */
Expand Down
12 changes: 7 additions & 5 deletions packages/server-with-auth/src/data/lowdb-user-dao.test.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
/**
* @jest-environment node
*/
import { MemorySync } from "lowdb";
import LowDBUserDao from "./lowdb-user-dao.js";
import LowDBUserDao, { createInMemoryDb } from "./lowdb-user-dao.js";

describe("lowdb-user-dao", () => {
// This is a user that we will reuse in our tests
Expand All @@ -11,12 +10,15 @@ describe("lowdb-user-dao", () => {
password: "password",
};

/** @type {LowSync} */
let db;
/** @type {LowDBUserDao} */
let dao;

beforeEach(() => {
// Before each test reset our users database
dao = new LowDBUserDao([], new MemorySync());
db = createInMemoryDb();
dao = new LowDBUserDao(db);
});

it("creates a user", async () => {
Expand Down Expand Up @@ -97,13 +99,13 @@ describe("lowdb-user-dao", () => {
it("deletes a user by id", async () => {
const user = await dao.createUser(data);

expect(dao.getDB().data.users).toHaveLength(1);
expect(db.data.users).toHaveLength(1);

const deleted = dao.deleteUser(user.id);

expect(deleted).toBe(true);
expect(dao.getUserById(user.id)).toBeUndefined();

expect(dao.getDB().data.users).toHaveLength(0);
expect(db.data.users).toHaveLength(0);
});
});
7 changes: 6 additions & 1 deletion packages/server-with-auth/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ export { default as checkAuth } from "./checkAuth.js";
export { default as createAppServer } from "./createAppServer.js";
export { default as schema } from "./schema/user.js";
export { default as SimpleUsersDao } from "./data/simple-users-dao.js";
export { default as LowDBUserDao } from "./data/lowdb-user-dao.js";
export {
default as LowDBUserDao,
createDb,
createInMemoryDb,
createJsonFileDb,
} from "./data/lowdb-user-dao.js";
5 changes: 2 additions & 3 deletions packages/server-with-auth/src/routes/auth.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
* @jest-environment node
*/
import request from "supertest";
import { MemorySync } from "lowdb";
import createAppServer from "../createAppServer";
import LowDBUserDao from "../data/lowdb-user-dao.js";
import LowDBUserDao, { createInMemoryDb } from "../data/lowdb-user-dao.js";

// This suppresses a warning we don't need in tests
process.env.JWT_SECRET = "SECRET";

let dao = new LowDBUserDao([], new MemorySync());
let dao = new LowDBUserDao(createInMemoryDb());

// We want to explicitly test functionality we disable during testing
process.env.NODE_ENV = "override";
Expand Down

0 comments on commit 5db7ba4

Please sign in to comment.