misskey/test/api.js
2017-02-14 14:48:08 +09:00

1250 lines
33 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* API TESTS
*/
Error.stackTraceLimit = Infinity;
// During the test the env variable is set to test
process.env.NODE_ENV = 'test';
// Display detail of unhandled promise rejection
process.on('unhandledRejection', console.dir);
// Init babel
require('babel-core/register');
require('babel-polyfill');
const fs = require('fs');
const chai = require('chai');
const chaiHttp = require('chai-http');
const should = chai.should();
chai.use(chaiHttp);
const server = require('../built/api/server');
const db = require('../built/db/mongodb').default;
const request = (endpoint, params, me) => new Promise((ok, ng) => {
const auth = me ? {
i: me.token
} : {};
chai.request(server)
.post(endpoint)
.send(Object.assign(auth, params))
.end((err, res) => {
ok(res);
});
});
describe('API', () => {
// Reset database each test
beforeEach(() => Promise.all([
db.get('users').drop(),
db.get('posts').drop(),
db.get('drive_files').drop(),
db.get('drive_folders').drop(),
db.get('apps').drop(),
db.get('access_tokens').drop(),
db.get('auth_sessions').drop()
]));
afterEach(cb => setTimeout(cb, 100));
it('greet server', done => {
chai.request(server)
.get('/')
.end((err, res) => {
res.should.have.status(200);
res.text.should.be.equal('YEE HAW');
done();
});
});
describe('signup', () => {
it('不正なユーザー名でアカウントが作成できない', done => {
request('/signup', {
username: 'sakurako.',
password: 'HimawariDaisuki06160907'
}).then(res => {
res.should.have.status(400);
done();
});
});
it('空のパスワードでアカウントが作成できない', done => {
request('/signup', {
username: 'sakurako',
password: ''
}).then(res => {
res.should.have.status(400);
done();
});
});
it('正しくアカウントが作成できる', done => {
const me = {
username: 'sakurako',
password: 'HimawariDaisuki06160907'
};
request('/signup', me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('username').eql(me.username);
done();
});
});
it('同じユーザー名のアカウントは作成できない', () => new Promise(async (done) => {
const user = await insertSakurako();
request('/signup', {
username: user.username,
password: 'HimawariDaisuki06160907'
}).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('signin', () => {
it('間違ったパスワードでサインインできない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/signin', {
username: me.username,
password: 'kyoppie'
}).then(res => {
res.should.have.status(400);
res.text.should.be.equal('incorrect password');
done();
});
}));
it('正しい情報でサインインできる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/signin', {
username: me.username,
password: 'HimawariDaisuki06160907'
}).then(res => {
res.should.have.status(204);
done();
});
}));
});
describe('i/update', () => {
it('アカウント設定を更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const myName = '大室櫻子';
const myLocation = '七森中';
const myBirthday = '2000-09-07';
request('/i/update', {
name: myName,
location: myLocation,
birthday: myBirthday
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('name').eql(myName);
res.body.should.have.property('location').eql(myLocation);
res.body.should.have.property('birthday').eql(myBirthday);
done();
});
}));
it('誕生日の設定を削除できる', () => new Promise(async (done) => {
const me = await insertSakurako({
birthday: '2000-09-07'
});
request('/i/update', {
birthday: ''
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('birthday').eql(null);
done();
});
}));
it('不正な誕生日の形式で怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/i/update', {
birthday: '2000/09/07'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('users/show', () => {
it('ユーザーが取得できる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/users/show', {
user_id: me._id.toString()
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('id').eql(me._id.toString());
done();
});
}));
it('ユーザーが存在しなかったら怒る', () => new Promise(async (done) => {
request('/users/show', {
user_id: '000000000000000000000000'
}).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
request('/users/show', {
user_id: 'kyoppie'
}).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('posts/create', () => {
it('投稿できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
text: 'ひまわりー'
};
request('/posts/create', post, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('text').eql(post.text);
done();
});
}));
it('ファイルを添付できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id
});
request('/posts/create', {
media_ids: [file._id.toString()]
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('media_ids').eql([file._id.toString()]);
done();
});
}));
it('他人のファイルは添付できない', () => new Promise(async (done) => {
const me = await insertSakurako();
const hima = await insertHimawari();
const file = await insertDriveFile({
user_id: hima._id
});
request('/posts/create', {
media_ids: [file._id.toString()]
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないファイルは添付できない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
media_ids: ['000000000000000000000000']
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正なファイルIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
media_ids: ['kyoppie']
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('返信できる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'ひま'
});
const me = await insertSakurako();
const post = {
text: 'さく',
reply_to_id: himaPost._id.toString()
};
request('/posts/create', post, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('text').eql(post.text);
res.body.should.have.property('reply_to_id').eql(post.reply_to_id);
res.body.should.have.property('reply_to');
res.body.reply_to.should.have.property('text').eql(himaPost.text);
done();
});
}));
it('repostできる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'こらっさくらこ!'
});
const me = await insertSakurako();
const post = {
repost_id: himaPost._id.toString()
};
request('/posts/create', post, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('repost_id').eql(post.repost_id);
res.body.should.have.property('repost');
res.body.repost.should.have.property('text').eql(himaPost.text);
done();
});
}));
it('引用repostできる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'こらっさくらこ!'
});
const me = await insertSakurako();
const post = {
text: 'さく',
repost_id: himaPost._id.toString()
};
request('/posts/create', post, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('text').eql(post.text);
res.body.should.have.property('repost_id').eql(post.repost_id);
res.body.should.have.property('repost');
res.body.repost.should.have.property('text').eql(himaPost.text);
done();
});
}));
it('文字数ぎりぎりで怒られない', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
text: '!'.repeat(1000)
};
request('/posts/create', post, me).then(res => {
res.should.have.status(200);
done();
});
}));
it('文字数オーバーで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
text: '!'.repeat(1001)
};
request('/posts/create', post, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないリプライ先で怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
text: 'さく',
reply_to_id: '000000000000000000000000'
};
request('/posts/create', post, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないrepost対象で怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
repost_id: '000000000000000000000000'
};
request('/posts/create', post, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正なリプライ先IDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
text: 'さく',
reply_to_id: 'kyoppie'
};
request('/posts/create', post, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正なrepost対象IDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const post = {
repost_id: 'kyoppie'
};
request('/posts/create', post, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('投票を添付できる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
text: 'インデントするなら',
poll: {
choices: ['スペース', 'タブ']
}
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('poll');
done();
});
}));
it('投票の選択肢が無くて怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
poll: {}
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('投票の選択肢が無くて怒られる (空の配列)', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
poll: {
choices: []
}
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('投票の選択肢が1つで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/create', {
poll: {
choices: ['Strawberry Pasta']
}
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('posts/show', () => {
it('投稿が取得できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const myPost = await db.get('posts').insert({
user_id: me._id,
text: 'お腹ペコい'
});
request('/posts/show', {
post_id: myPost._id.toString()
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('id').eql(myPost._id.toString());
done();
});
}));
it('投稿が存在しなかったら怒る', () => new Promise(async (done) => {
request('/posts/show', {
post_id: '000000000000000000000000'
}).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
request('/posts/show', {
post_id: 'kyoppie'
}).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('posts/likes/create', () => {
it('いいねできる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'ひま'
});
const me = await insertSakurako();
request('/posts/likes/create', {
post_id: himaPost._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('自分の投稿にはいいねできない', () => new Promise(async (done) => {
const me = await insertSakurako();
const myPost = await db.get('posts').insert({
user_id: me._id,
text: 'お腹ペコい'
});
request('/posts/likes/create', {
post_id: myPost._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('二重にいいねできない', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'ひま'
});
const me = await insertSakurako();
await db.get('likes').insert({
user_id: me._id,
post_id: himaPost._id
});
request('/posts/likes/create', {
post_id: himaPost._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しない投稿にはいいねできない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/create', {
post_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('空のパラメータで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/create', {}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/create', {
post_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('posts/likes/delete', () => {
it('いいね解除できる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'ひま'
});
const me = await insertSakurako();
await db.get('likes').insert({
user_id: me._id,
post_id: himaPost._id
});
request('/posts/likes/delete', {
post_id: himaPost._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('いいねしていない投稿はいいね解除できない', () => new Promise(async (done) => {
const hima = await insertHimawari();
const himaPost = await db.get('posts').insert({
user_id: hima._id,
text: 'ひま'
});
const me = await insertSakurako();
request('/posts/likes/delete', {
post_id: himaPost._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しない投稿はいいね解除できない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/delete', {
post_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('空のパラメータで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/delete', {}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/posts/likes/delete', {
post_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('following/create', () => {
it('フォローできる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
request('/following/create', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('過去にフォロー歴があった状態でフォローできる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
await db.get('following').insert({
followee_id: hima._id,
follower_id: me._id,
deleted_at: new Date()
});
request('/following/create', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('既にフォローしている場合は怒る', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
await db.get('following').insert({
followee_id: hima._id,
follower_id: me._id
});
request('/following/create', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないユーザーはフォローできない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/create', {
user_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('自分自身はフォローできない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/create', {
user_id: me._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('空のパラメータで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/create', {}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/create', {
user_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('following/delete', () => {
it('フォロー解除できる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
await db.get('following').insert({
followee_id: hima._id,
follower_id: me._id
});
request('/following/delete', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('過去にフォロー歴があった状態でフォロー解除できる', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
await db.get('following').insert({
followee_id: hima._id,
follower_id: me._id,
deleted_at: new Date()
});
await db.get('following').insert({
followee_id: hima._id,
follower_id: me._id
});
request('/following/delete', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(204);
done();
});
}));
it('フォローしていない場合は怒る', () => new Promise(async (done) => {
const hima = await insertHimawari();
const me = await insertSakurako();
request('/following/delete', {
user_id: hima._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないユーザーはフォロー解除できない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/delete', {
user_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('自分自身はフォロー解除できない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/delete', {
user_id: me._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('空のパラメータで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/delete', {}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/following/delete', {
user_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('drive', () => {
it('ドライブ情報を取得できる', () => new Promise(async (done) => {
const me = await insertSakurako();
await insertDriveFile({
user_id: me._id,
datasize: 256
});
await insertDriveFile({
user_id: me._id,
datasize: 512
});
await insertDriveFile({
user_id: me._id,
datasize: 1024
});
request('/drive', {}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('usage').eql(1792);
done();
});
}));
});
describe('drive/files/create', () => {
it('ファイルを作成できる', () => new Promise(async (done) => {
const me = await insertSakurako();
chai.request(server)
.post('/drive/files/create')
.field('i', me.token)
.attach('file', fs.readFileSync(__dirname + '/resources/Lenna.png'), 'Lenna.png')
.end((err, res) => {
if (err) console.error(err);
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('name').eql('Lenna.png');
done();
});
}));
it('ファイル無しで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/files/create', {}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('drive/files/update', () => {
it('名前を更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id
});
const newName = 'いちごパスタ.png';
request('/drive/files/update', {
file_id: file._id.toString(),
name: newName
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('name').eql(newName);
done();
});
}));
it('他人のファイルは更新できない', () => new Promise(async (done) => {
const me = await insertSakurako();
const hima = await insertHimawari();
const file = await insertDriveFile({
user_id: hima._id
});
request('/drive/files/update', {
file_id: file._id.toString(),
name: 'いちごパスタ.png'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('親フォルダを更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id
});
const folder = await insertDriveFolder({
user_id: me._id
});
request('/drive/files/update', {
file_id: file._id.toString(),
folder_id: folder._id.toString()
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('folder_id').eql(folder._id.toString());
done();
});
}));
it('親フォルダを無しにできる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id,
folder_id: '000000000000000000000000'
});
request('/drive/files/update', {
file_id: file._id.toString(),
folder_id: null
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('folder_id').eql(null);
done();
});
}));
it('他人のフォルダには入れられない', () => new Promise(async (done) => {
const me = await insertSakurako();
const hima = await insertHimawari();
const file = await insertDriveFile({
user_id: me._id
});
const folder = await insertDriveFolder({
user_id: hima._id
});
request('/drive/files/update', {
file_id: file._id.toString(),
folder_id: folder._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないフォルダで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id
});
request('/drive/files/update', {
file_id: file._id.toString(),
folder_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正なフォルダIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const file = await insertDriveFile({
user_id: me._id
});
request('/drive/files/update', {
file_id: file._id.toString(),
folder_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('ファイルが存在しなかったら怒る', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/files/update', {
file_id: '000000000000000000000000',
name: 'いちごパスタ.png'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('間違ったIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/files/update', {
file_id: 'kyoppie',
name: 'いちごパスタ.png'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('drive/folders/create', () => {
it('フォルダを作成できる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/folders/create', {
name: 'my folder'
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('name').eql('my folder');
done();
});
}));
});
describe('drive/folders/update', () => {
it('名前を更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder({
user_id: me._id
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
name: 'new name'
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('name').eql('new name');
done();
});
}));
it('他人のフォルダを更新できない', () => new Promise(async (done) => {
const me = await insertSakurako();
const hima = await insertHimawari();
const folder = await insertDriveFolder({
user_id: hima._id
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
name: 'new name'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('親フォルダを更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder({
user_id: me._id
});
const parentFolder = await insertDriveFolder({
user_id: me._id
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: parentFolder._id.toString()
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('parent_id').eql(parentFolder._id.toString());
done();
});
}));
it('親フォルダを無しに更新できる', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder({
user_id: me._id,
parent_id: '000000000000000000000000'
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: null
}, me).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('parent_id').eql(null);
done();
});
}));
it('他人のフォルダを親フォルダに設定できない', () => new Promise(async (done) => {
const me = await insertSakurako();
const hima = await insertHimawari();
const folder = await insertDriveFolder({
user_id: me._id
});
const parentFolder = await insertDriveFolder({
user_id: hima._id
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: parentFolder._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('フォルダが循環するような構造にできない', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder();
const parentFolder = await insertDriveFolder({
parent_id: folder._id
});
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: parentFolder._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('フォルダが循環するような構造にできない(再帰的)', () => new Promise(async (done) => {
const me = await insertSakurako();
const folderA = await insertDriveFolder();
const folderB = await insertDriveFolder({
parent_id: folderA._id
});
const folderC = await insertDriveFolder({
parent_id: folderB._id
});
request('/drive/folders/update', {
folder_id: folderA._id.toString(),
parent_id: folderC._id.toString()
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しない親フォルダを設定できない', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder();
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正な親フォルダIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
const folder = await insertDriveFolder();
request('/drive/folders/update', {
folder_id: folder._id.toString(),
parent_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('存在しないフォルダを更新できない', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/folders/update', {
folder_id: '000000000000000000000000'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
it('不正なフォルダIDで怒られる', () => new Promise(async (done) => {
const me = await insertSakurako();
request('/drive/folders/update', {
folder_id: 'kyoppie'
}, me).then(res => {
res.should.have.status(400);
done();
});
}));
});
describe('auth/session/generate', () => {
it('認証セッションを作成できる', () => new Promise(async (done) => {
const app = await insertApp();
request('/auth/session/generate', {
app_secret: app.secret
}).then(res => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.have.property('token');
res.body.should.have.property('url');
done();
});
}));
it('app_secret 無しで怒られる', () => new Promise(async (done) => {
request('/auth/session/generate', {}).then(res => {
res.should.have.status(400);
done();
});
}));
it('誤った app secret で怒られる', () => new Promise(async (done) => {
request('/auth/session/generate', {
app_secret: 'kyoppie'
}).then(res => {
res.should.have.status(400);
done();
});
}));
});
});
async function insertSakurako(opts) {
return await db.get('users').insert(Object.assign({
token: '!00000000000000000000000000000000',
username: 'sakurako',
username_lower: 'sakurako',
password: '$2a$08$FnHXg3tP.M/kINWgQSXNqeoBsiVrkj.ecXX8mW9rfBzMRkibYfjYy' // HimawariDaisuki06160907
}, opts));
}
async function insertHimawari(opts) {
return await db.get('users').insert(Object.assign({
token: '!00000000000000000000000000000001',
username: 'himawari',
username_lower: 'himawari',
password: '$2a$08$OPESxR2RE/ZijjGanNKk6ezSqGFitqsbZqTjWUZPLhORMKxHCbc4O' // ilovesakurako
}, opts));
}
async function insertDriveFile(opts) {
return await db.get('drive_files').insert(Object.assign({
name: 'strawberry-pasta.png'
}, opts));
}
async function insertDriveFolder(opts) {
return await db.get('drive_folders').insert(Object.assign({
name: 'my folder',
parent_id: null
}, opts));
}
async function insertApp(opts) {
return await db.get('apps').insert(Object.assign({
name: 'my app',
secret: 'mysecret'
}, opts));
}