Skip to content

Commit

Permalink
Merge pull request #85 from CirclesUBI/case-insensitivity
Browse files Browse the repository at this point in the history
Introduce case insensitivity for usernames
  • Loading branch information
adzialocha authored Jun 21, 2021
2 parents 09c2372 + 7a43e8f commit 290b7a5
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 36 deletions.
15 changes: 8 additions & 7 deletions src/controllers/users.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import httpStatus from 'http-status';
import { Op } from 'sequelize';
import Sequelize, { Op } from 'sequelize';

import APIError from '../helpers/errors';
import User from '../models/users';
Expand Down Expand Up @@ -65,21 +65,22 @@ async function checkSaltNonce(saltNonce, address, safeAddress) {
}

async function checkIfExists(username, safeAddress) {
const equalUsernameCondition = Sequelize.where(
Sequelize.fn('lower', Sequelize.col('username')),
Sequelize.fn('lower', username),
);

const response = await User.findOne({
where: safeAddress
? {
[Op.or]: [
{
username,
},
equalUsernameCondition,
{
safeAddress,
},
],
}
: {
username,
},
: equalUsernameCondition,
});

if (response) {
Expand Down
95 changes: 66 additions & 29 deletions test/users-create.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,42 @@ import { randomChecksumAddress } from './utils/common';
import User from '~/models/users';
import app from '~';

describe('PUT /users - Creating a new user', () => {
let nonce;
let safeAddress;
let username;
let email;
let avatarUrl;
function prepareUser({ username = 'donkey' } = {}) {
const safeAddress = randomChecksumAddress();
const nonce = new Date().getTime();
const email = 'dk@kong.com';
const avatarUrl = 'https://storage.com/image.jpg';

const payload = createUserPayload({
nonce,
safeAddress,
username,
email,
avatarUrl,
});

mockRelayerSafe({
address: payload.address,
nonce,
safeAddress,
isCreated: true,
isDeployed: false,
});

return payload;
}

describe('PUT /users - Creating a new user', () => {
let payload;

beforeEach(() => {
safeAddress = randomChecksumAddress();
nonce = new Date().getTime();
username = 'donkey';
email = 'dk@kong.com';
avatarUrl = 'https://storage.com/image.jpg';

payload = createUserPayload({
nonce,
safeAddress,
username,
email,
avatarUrl,
});

mockRelayerSafe({
address: payload.address,
nonce,
safeAddress,
isCreated: true,
isDeployed: false,
});
payload = prepareUser();
});

afterAll(async () => {
afterEach(async () => {
return await User.destroy({
where: {
username,
username: payload.data.username,
},
});
});
Expand All @@ -63,3 +62,41 @@ describe('PUT /users - Creating a new user', () => {
.expect(httpStatus.CONFLICT);
});
});

describe('PUT /users - Fail when username is too similar', () => {
let correctPayload;
const duplicatePayloads = [];

beforeEach(() => {
correctPayload = prepareUser({ username: 'myUsername' });
duplicatePayloads[0] = prepareUser({ username: 'myusername' });
duplicatePayloads[1] = prepareUser({ username: 'MYUSERNAME' });
duplicatePayloads[2] = prepareUser({ username: 'MyUsername' });
duplicatePayloads[3] = prepareUser({ username: 'myUserName' });
});

afterEach(async () => {
return await User.destroy({
where: {
username: correctPayload.data.username,
},
});
});

it('should reject same username with different letter case', async () => {
await request(app)
.put('/api/users')
.send(correctPayload)
.set('Accept', 'application/json')
.expect(httpStatus.CREATED);

// Same username already exists
for (const payload of duplicatePayloads) {
await request(app)
.put('/api/users')
.send(payload)
.set('Accept', 'application/json')
.expect(httpStatus.CONFLICT);
}
});
});

0 comments on commit 290b7a5

Please sign in to comment.