c9-core/plugins/c9.preview/preview_test.js

160 wiersze
6.0 KiB
JavaScript

#!/usr/bin/env node
/*global describe it before after beforeEach afterEach */
"use strict";
"use server";
require("c9/inline-mocha")(module);
require("c9/setup_paths");
var async = require("async");
var assert = require("assert");
var nock = require("nock");
var RestClient = require("c9/rest_client");
var baseTest = require('../c9.api/base_test');
var testDb = require("../c9.db.redis/test_redis");
var setupFixtures = require("test/lib/integration/setup");
describe(__filename, function() {
var db, serverList, client;
var testUser, testProject, testRemote, testContainer;
var loggedInUser = null;
before(function(next) {
baseTest({
config: "preview",
}, function(err, services) {
db = services.db;
serverList = services["vfs.serverlist"];
services.connect.useSetup(function(req, res, next) {
req.user = loggedInUser;
next();
});
client = new RestClient("localhost", services.apiPort, {
debug: false
});
testUser = require("test/lib/integration/db/user")(db);
testProject = require("test/lib/integration/db/project")(db);
testRemote = require("test/lib/integration/db/mock-remote")(db);
testContainer = require("test/lib/integration/db/mock-container")(db);
next(err);
});
});
after(function(next) {
testDb.stop(next);
});
beforeEach(function(next) {
serverList._testSetServerList([{
url: "http://vfs.c9.dev",
internalUrl: "http://vfs.c9.dev"
}]);
testDb.reset(next);
});
describe("preview", function() {
it("Should authorize users correctly", function(next) {
var user1, user2;
var public1, private1, private2;
// user1 user2
// user2/public
// user2/private1 user1 has no access
// user2/private2 user1 is collaborator
setupFixtures(
testUser.create(),
testUser.create(),
testProject.create(),
testRemote.create({type: "docker"}),
testContainer.create(),
testProject.create(),
testRemote.create({type: "docker"}),
testContainer.create(),
testProject.create(),
testRemote.create({type: "docker"}),
testContainer.create(),
function(ctx, next) {
user1 = ctx.users[0];
user2 = ctx.users[1];
public1 = ctx.projects[0];
private1 = ctx.projects[1];
private2 = ctx.projects[2];
next();
},
function(ctx, next) {
public1.owner = user2;
public1.visibility = "public";
public1.save(next);
},
function(ctx, next) {
private1.owner = user2;
private1.visibility = "private";
private1.save(next);
},
function(ctx, next) {
private2.owner = user2;
private2.visibility = "private";
private2.save(next);
},
function(ctx, next) {
db.WorkspaceMember.create(
private2,
user1.id,
db.WorkspaceMember.ACL_R,
db.Project.ROLE_COLLABORATOR, null, next
);
},
function(fixtures, teardown) {
/*
* Logged in Role Visibility ACTION
* =================================================================
* true none public view
* false none public view
* true none private forbidden
* false none private unauthorized
* true visitor/collaborator/admin public view
* true visitor/collaborator/admin private view
*/
var expect = [
{ uid: user1.id, role: db.Project.ROLE_NONE, p: public1, code: 200 },
{ uid: -1, role: db.Project.ROLE_NONE, p: public1, code: 200 },
{ uid: user1.id, role: db.Project.ROLE_NONE, p: private1, code: 403 },
{ uid: -1, role: db.Project.ROLE_NONE, p: private1, code: 302 }, // redirect to login page
{ uid: user1.id, role: db.Project.ROLE_COLLABORATOR, p: public1, code: 200 },
{ uid: user2.id, role: db.Project.ROLE_ADMIN, p: private2, code: 200 }
];
async.eachSeries(expect, function(expect, next) {
var path = "/" + expect.p.owner.name + "/" + expect.p.name + "/";
nock('http://vfs.c9.dev')
.get("/" + expect.p.id + "/preview/")
.reply(200, []);
loggedInUser = {
id: expect.uid
};
client.get(path, function (err, res) {
assert((err && err.code) == expect.code || expect.code == 200, "Wrong return code");
next();
});
}, function(err) {
if (err) return next(err);
teardown(next);
});
}
);
});
});
});