sync/integration_test/db/account.js

158 lines
4.7 KiB
JavaScript

const assert = require('assert');
const AccountDB = require('../../lib/db/account').AccountDB;
const testDB = require('../testutil/db').testDB;
const { InvalidRequestError } = require('../../lib/errors');
const accountDB = new AccountDB(testDB);
function cleanup() {
return testDB.knex.table('users').del();
}
function insert(user) {
return testDB.knex.table('users').insert(user);
}
function fetch(params) {
return testDB.knex.table('users').where(params).first();
}
describe('AccountDB', () => {
let account, expected;
beforeEach(() => {
account = {
name: 'test',
password: '',
global_rank: 1,
email: 'test@example.com',
profile: '{"image":"image.jpeg","text":"blah"}',
ip: '1.2.3.4',
time: 1500000000000,
name_dedupe: 'test'
};
expected = {
name: 'test',
password: '',
global_rank: 1,
email: 'test@example.com',
profile: {
image: 'image.jpeg',
text: 'blah'
},
ip: '1.2.3.4',
time: new Date(1500000000000),
name_dedupe: 'test'
};
});
beforeEach(cleanup);
describe('#getByName', () => {
it('retrieves an account by name', () => {
return insert(account).then(() => {
return accountDB.getByName('test');
}).then(retrieved => {
delete retrieved.id;
assert.deepStrictEqual(retrieved, expected);
});
});
it('defaults a blank profile', () => {
account.profile = '';
expected.profile = { image: '', text: '' };
return insert(account).then(() => {
return accountDB.getByName('test');
}).then(retrieved => {
delete retrieved.id;
assert.deepStrictEqual(retrieved, expected);
});
});
it('defaults an erroneous profile', () => {
account.profile = '{not real json';
expected.profile = { image: '', text: '' };
return insert(account).then(() => {
return accountDB.getByName('test');
}).then(retrieved => {
delete retrieved.id;
assert.deepStrictEqual(retrieved, expected);
});
});
it('returns null when no account is found', () => {
return accountDB.getByName('test').then(retrieved => {
assert.deepStrictEqual(retrieved, null);
});
});
});
describe('#updateByName', () => {
it('updates the password hash', () => {
return insert(account).then(() => {
return accountDB.updateByName(
account.name,
{ password: 'secret hash' }
);
}).then(() => {
return fetch({ name: account.name });
}).then(retrieved => {
assert.strictEqual(retrieved.password, 'secret hash');
});
});
it('updates the email', () => {
return insert(account).then(() => {
return accountDB.updateByName(
account.name,
{ email: 'bar@example.com' }
);
}).then(() => {
return fetch({ name: account.name });
}).then(retrieved => {
assert.strictEqual(retrieved.email, 'bar@example.com');
});
});
it('updates the profile', () => {
return insert(account).then(() => {
return accountDB.updateByName(
account.name,
{ profile: { image: 'shiggy.jpg', text: 'Costanza' } }
);
}).then(() => {
return fetch({ name: account.name });
}).then(retrieved => {
assert.deepStrictEqual(
retrieved.profile,
'{"image":"shiggy.jpg","text":"Costanza"}'
);
});
});
it('raises an error if the username does not exist', () => {
return accountDB.updateByName(
account.name,
{ password: 'secret hash' }
).then(() => {
throw new Error('Expected failure due to missing user');
}).catch(error => {
assert(
error instanceof InvalidRequestError,
'Expected InvalidRequestError'
);
assert.strictEqual(
error.message,
'Cannot update: name "test" does not exist'
);
});
});
});
});