sbkwgh 7 tahun lalu
induk
melakukan
cef266a6ef
1 mengubah file dengan 205 tambahan dan 0 penghapusan
  1. 205 0
      test/adminUser.js

+ 205 - 0
test/adminUser.js

@@ -0,0 +1,205 @@
+process.env.NODE_ENV = 'test'
+
+let chai = require('chai')
+let server = require('../server')
+let should = chai.should()
+let expect = chai.expect
+
+let { sequelize, User, Category, Thread, Post} = require('../models')
+const Errors = require('../lib/errors.js')
+
+chai.use(require('chai-http'))
+chai.use(require('chai-things'))
+
+describe('GET /user', () => {
+	let adminAgent = chai.request.agent(server)
+
+	//Wait for app to start before commencing
+	before((done) => {
+		const NumUsers = 65;
+		const NumThreads = 5;
+		const NumPosts = 30;
+
+		function createCategory  () {
+			return Category.create({
+				name: 'category-name'
+			});
+		}
+
+		async function createUsers (category) {
+			let userPromises = [];
+			for(let i = 0; i < NumUsers; i++) {
+				userPromises.push(
+					User.create({
+						username: i === 1 ? 'admin123' : 'username' + i,
+						hash: 'password',
+						admin: i === 1
+					})
+				)
+			}
+			let users = await Promise.all(userPromises);
+
+			return { category, users };
+		}
+
+		async function createThreads (params) {
+			let { category, users } = params;
+
+			let threadPromises = [];
+			for(let i = 0; i < NumThreads; i++) {
+				threadPromises.push(
+					Thread.create({
+						name: 'thread' + i
+					})
+				);
+			}
+			let threads = await Promise.all(threadPromises);
+
+			threads.map(async (thread, i) => {
+				await thread.setCategory(category);
+				await thread.setUser(users[i]);
+			})
+
+			return { threads, category, users };
+		}
+
+		async function createPosts (params) {
+			let { threads, category, users } = params;
+
+			let postPromises = [];
+			for(let i = 0; i < NumPosts; i++) {
+				postPromises.push(
+					Post.create({
+						content: 'post' + i,
+						postNumber: 1
+					})
+				);
+			}
+			let posts = await Promise.all(postPromises);
+
+
+			posts.map(async (post, i) => {
+				await post.setUser(users[i % NumUsers]);
+				await post.setThread(threads[i % NumThreads]);
+			});
+
+			return posts;
+		}
+
+		function login () {
+			return adminAgent
+				.post('/api/v1/user/admin123/login')
+				.set('content-type', 'application/json')
+				.send({
+					password: 'password'
+				});
+		}
+
+		function createMockData () {
+			createCategory()
+				.then(createUsers)
+				.then(createThreads)
+				.then(createPosts)
+				.then(login)
+				.then(_ => {
+					done();
+				})
+				.catch(err => {
+					console.log(err)
+				})
+		}
+
+		if(server.locals.appStarted) createMockData()
+		server.on('appStarted', () => {
+			createMockData()
+		})
+	})
+
+	//Delete all rows in table after
+	//tests completed
+	after(() => sequelize.sync({ force: true }) )
+
+	it('should get first 30 users, by default ordered by username descending', (done) => {
+		adminAgent.get('/api/v1/user').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(30);
+			res.body[0].username.should.equal('admin123');
+			res.body[29].username.should.equal('username28');
+
+			done();
+		});
+	})
+	it('should paginate correctly', (done) => {
+		adminAgent.get('/api/v1/user?offset=60').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(30);
+			res.body[0].username.should.equal('username60');
+			res.body[29].username.should.equal('username64');
+
+			done();
+		});
+	})
+	it('should enable sorting by username ascending', (done) => {
+		adminAgent.get('/api/v1/user?sort=username&order=asc').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(30);
+			res.body[0].username.should.equal('username64');
+			res.body[29].username.should.equal('username44');
+
+			done();
+		});
+	})
+	/*it('should enable filtering by username', (done) => {
+		adminAgent.get('/api/v1/user', (err, res) => {
+			res.body.should.contain
+		});
+	})*/
+	it('should enable filtering by role (admin or user)', (done) => {
+		adminAgent.get('/api/v1/user?role=admin').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(1);
+			res.body[0].username.should.equal('admin123');
+
+			done();
+		});
+	})
+	/*it('should enable sorting by date joined', (done) => {
+		adminAgent.get('/api/v1/user', (err, res) => {
+			res.body.should.contain
+		});
+	})*/
+	it('should enable sorting by number of posts', (done) => {
+		adminAgent.get('/api/v1/user?sort=posts&order=asc').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(30);
+			res.body[0].username.should.equal('username0');
+			res.body[29].username.should.equal('username28');
+
+			done();
+		});
+	})
+	it('should enable sorting by number of threads', (done) => {
+		adminAgent.get('/api/v1/user?sort=threads&order=asc').end((err, res) => {
+			if(err) done(err);
+
+			res.body.should.have.length(30);
+			res.body[0].username.should.equal('username0');
+			res.body[29].username.should.equal('username28');
+
+			done();
+		});
+	})
+	it('should throw an error if not logged in', (done) => {
+		adminAgent.get('/api/v1/user').end((err, res) => {
+			expect(err).to.exist;
+			res.body.errors.should.contain.something.that.deep.equals(Errors.requestNotAuthorized)
+
+			done();
+		});
+	})
+})