kata-cli
Version:
Kata AI Command Line Tools
368 lines (310 loc) • 15.1 kB
text/typescript
// tslint:disable:member-access
import { readFileSync } from "fs";
import { safeLoad } from "js-yaml";
import { Config, IConfig } from "merapi";
import { suite, test } from "mocha-typescript";
import { assert, stub } from "sinon";
import Api from "../../components/api/api";
import Zaun from "../../components/api/zaun";
import Helper from "../../components/scripts/helper";
import User from "../../components/users/user";
import { IHelper } from "../../interfaces/main";
class UserTest {
private config: IConfig;
private helper: IHelper;
private api: any;
private user: any;
private userTokenObj = {
id: '84330d2b-f2f8-499c-adee-99d2c533e7d5',
type: 'user',
label: 'dashboard',
userId: '5c0a78c2-3a2c-447a-80d2-069761be3ef9',
teamId: <string>null,
botId: <string>null,
roleId: 'ccd9b640-93c4-43b6-8523-f324f89faad6',
expire: 1503789662
};
private teamTokenObj = {
id: 'ea43b3b6-3c7f-4bd8-98f3-e58ee699b5b3',
type: 'team',
label: <string>null,
userId: '8a62686d-695c-44f0-a57c-4ca19f5bf78b',
teamId: 'e563ec87-dae9-45f0-a2b3-515a069fb2b0',
botId: <string>null,
roleId: '81b179bc-fa56-4c27-92db-a1602abe48c2',
expire: 1506907823
};
private userObj = {
id: '9ad603b7-5c33-432c-9752-2f4816b6bd9f',
type: 'user',
label: 'dashboard',
userId: '05c7f7a7-fba6-437a-8e6d-72c9f71c6352',
roleId: 'b3941608-1494-4983-9b64-af746b601190',
expire: 1506915325
}
private teamObj = {
id: "e563ec87-dae9-45f0-a2b3-515a069fb2b0",
username: "user1",
password: "password",
type: "team",
email: null as string,
profile: null as string,
roleId: "55f7d797-a938-4f59-9c6a-cf6cd8a01d08",
created_at: "2017-06-18T01:46:13.000Z",
updated_at: "2017-06-18T01:46:13.000Z",
teams: [{ teamId: "e563ec87-dae9-45f0-a2b3-515a069fb2b0", username: "team1" }] as any[]
};
constructor() {
let zaun = Zaun();
let configJson = safeLoad(readFileSync("./service.yml", "utf8"));
this.config = Config.create(configJson);
this.helper = new Helper(this.config);
this.api = new Api(this.helper, zaun);
this.user = new User(this.helper, this.api);
}
async "function login should call login api successfully with user token"() {
let getTokenStub = stub(this.helper, "getCurrentToken").returns({token: "token"});
let getTokenInfoStub = stub(this.api.authApi, "tokensTokenIdGet").callsFake((tokenId, callback) => {
callback(null, this.userTokenObj);
});
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp").returns({});
await this.user.login({ token: "userToken" });
getTokenStub.restore();
getTokenInfoStub.restore();
setPropStub.restore();
getPropStub.restore();
assert.calledWith(setPropStub, "current_login", "user");
assert.calledWith(setPropStub, "token", { user: "userToken" });
}
async "function whoami should print current user login"() {
let getTokenStub = stub(this.helper, "getCurrentToken").returns({token: "token"});
let getTokenInfoStub = stub(this.api.authApi, "tokensTokenIdGet").callsFake((tokenId, callback) => {
callback(null, this.userTokenObj);
});
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp").returns("user");
let consoleLogStub = stub(console, "log");
await this.user.login({ token: "userToken" });
this.user.whoami();
consoleLogStub.restore();
getTokenStub.restore();
getTokenInfoStub.restore();
setPropStub.restore();
getPropStub.restore();
assert.calledWith(getPropStub, "current_login");
assert.calledWith(getPropStub, "current_user_type");
assert.calledWith(consoleLogStub, "Current login: user, login type: user");
}
async "function login should call login api successfully with team token"() {
let getTokenStub = stub(this.helper, "getCurrentToken").returns({token: "token"});
let getTokenInfoStub = stub(this.api.authApi, "tokensTokenIdGet").callsFake((tokenId, callback) => {
callback(null, this.teamTokenObj);
});
let getUserInfoStub = stub(this.api.userApi, "usersUserIdGet").callsFake((userId, callback) => {
callback(null, this.teamObj);
});
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp").returns({});
await this.user.login({ token: "teamToken" });
getTokenStub.restore();
getTokenInfoStub.restore();
setPropStub.restore();
getPropStub.restore();
assert.calledWith(setPropStub, "current_login", this.teamObj.username);
assert.calledWith(setPropStub, "token", { "user1": "teamToken" });
}
async "function login should throw error if token type not user and not team"() {
let getTokenStub = stub(this.helper, "getCurrentToken").returns({token: "token"});
let getTokenInfoStub = stub(this.api.authApi, "tokensTokenIdGet").callsFake((tokenId, callback) => {
callback(null, {});
});
let consoleLogStub = stub(console, "log");
await this.user.login({ token: "userToken" });
getTokenStub.restore();
getTokenInfoStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, "Invalid token");
}
async "function login should call login api successfully with username & password"() {
let consoleLogStub = stub(console, "log");
let authObj = {
user: "user1",
password: "pass1"
};
let getTokenStub = stub(this.helper, "getCurrentToken").returns({token: "token"});
let loginStub = stub(this.api.authApi, "loginPost").callsFake((body, callback) => {
callback(null, this.userObj);
});
let userInfoStub = stub(this.api.userApi, "usersUserIdGet").callsFake((body, callback) => {
callback(null, {data: {id: "test", type: "user"}});
});
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp").returns({});
await this.user.login({ user: "user1", password: "pass1" });
getTokenStub.restore();
loginStub.restore();
setPropStub.restore();
getPropStub.restore();
consoleLogStub.restore();
assert.calledWith(setPropStub, "current_login", authObj.user);
assert.calledWith(setPropStub, "token", { "user1": this.userObj.id });
}
async "function switch should switch team successfully with team name"() {
const getTokenStub = stub(this.helper, "getCurrentToken").returns({ token: "token" });
const getUserInfoStub = stub(this.api.userApi, "usersUserIdGet").callsFake((userId, callback) => {
callback(null, this.teamObj, { body: this.teamObj });
});
const createTokenTeamStub = stub(this.api.authApi, "tokensPost").callsFake((body, callback) => {
callback(null, this.teamTokenObj), { body: this.teamTokenObj };
});
const setPropStub = stub(this.helper, "setProp");
const getPropStub = stub(this.helper, "getProp");
getPropStub.withArgs("first_login").returns({ user: "user1", type: "user" });
getPropStub.withArgs("current_user_type").returns("user");
await this.user.switch("team", "team1");
getTokenStub.restore();
getUserInfoStub.restore();
createTokenTeamStub.restore();
setPropStub.restore();
getPropStub.restore();
// consoleLogStub.restore();
assert.calledWith(setPropStub, "current_login", "team1");
assert.calledWith(setPropStub, "token", { "team1": this.teamTokenObj.id });
}
async "function switch should switch user successfully from team"() {
let consoleLogStub = stub(console, "log");
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp");
getPropStub.withArgs("first_login").returns({username: "user1", type: "user"});
getPropStub.withArgs("current_user_type").returns("team");
getPropStub.withArgs("current_login").returns("user1");
await this.user.switch("user");
setPropStub.restore();
getPropStub.restore();
consoleLogStub.restore();
assert.calledWith(setPropStub, "current_login", "user1");
assert.calledWith(setPropStub, "current_user_type", "user");
}
async "function switch should throw error when switch to current login type"() {
let consoleLogStub = stub(console, "log");
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp");
getPropStub.withArgs("first_login").returns({user: "user1", type: "user"});
getPropStub.withArgs("current_login").returns("user1");
getPropStub.withArgs("current_user_type").returns("user");
await this.user.switch("user");
setPropStub.restore();
getPropStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, "Unable to switch : already on user1 user");
}
async "function logout should logout successfully"() {
let consoleLogStub = stub(console, "log");
let inquirerPromptStub = stub(this.helper, "inquirerPrompt").returns({ confirmation: true })
let sDeleteStub = stub(this.helper, "delete").returns(true);
await this.user.logout();
consoleLogStub.restore();
inquirerPromptStub.restore();
sDeleteStub.restore();
assert.called(sDeleteStub);
}
async "function create team should create user successfully"() {
let newUser = "newUser";
let consoleLogStub = stub(console, "log");
let inquirerPromptStub = stub(this.helper, "inquirerPrompt").returns({answer: "password"});
let getUserInfoStub = stub(this.api.userApi, "usersUserIdGet").callsFake((userId, callback) => {
callback(null, {teams: []}), { body: {teams:[]} };
});;
let createUserStub = stub(this.api.userApi, "usersPost");
createUserStub.callsFake((body, callback) => {
callback(null, {username: newUser}, { body: { username: newUser } });
});
await this.user.createUser(newUser, {});
getUserInfoStub.restore();
createUserStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, `New user ${newUser} created !`);
}
async "function create team should throw error when user exists"() {
let newUser = "newUser";
let consoleLogStub = stub(console, "log");
let inquirerPromptStub = stub(this.helper, "inquirerPrompt").returns({answer: "password"});
let getUserInfoStub = stub(this.api.userApi, "usersUserIdGet").callsFake((userId, callback) => {
callback(null, {id: "test-id", teams: []}, { body: {id: "test-id", teams: []} } );
});;
let createUserStub = stub(this.api.userApi, "usersPost");
createUserStub.callsFake((body, callback) => {
callback(null, {username: newUser}, { body: {username: newUser} });
});
await this.user.createUser(newUser, {});
getUserInfoStub.restore();
createUserStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, `Username ${newUser} exist !`);
}
async "function create team should create team successfully"() {
let consoleLogStub = stub(console, "log");
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp");
let getUserInfoStub = stub(this.api.userApi, "usersUserIdGet");
let createTeamStub = stub(this.api.teamApi, "teamsPost");
let teamPostStub = stub(this.api.teamApi, "teamsTeamIdUsersUserIdPost");
getPropStub.withArgs("current_login").returns("user1");
getPropStub.withArgs("current_user_type").returns("user");
createTeamStub.callsFake((teamObj, callback) => {
callback(null, null, {body: {id: "team1"}})
})
getUserInfoStub.callsFake((userId, callback) => {
callback(null, this.userObj, { body: this.userObj });
});
teamPostStub.callsFake((teamId, userId, roleId, callback) => {
callback(null, null, {body: {team: this.teamObj}});
});
await this.user.createTeam("team1");
setPropStub.restore();
getPropStub.restore();
getUserInfoStub.restore();
teamPostStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, "Team team1 created !");
}
async "function create team should throw error when current login is team"() {
let consoleLogStub = stub(console, "log");
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp");
getPropStub.withArgs("current_login").returns("team1");
getPropStub.withArgs("current_user_type").returns("team");
await this.user.createTeam("team1");
setPropStub.restore();
getPropStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, "Must be on user to do this operation");
}
async "function create team should throw error when team name exist"() {
let consoleLogStub = stub(console, "log");
let setPropStub = stub(this.helper, "setProp");
let getPropStub = stub(this.helper, "getProp");
let getUserInfoStub = stub(this.api.userApi, "usersUserIdGet");
let createTeamStub = stub(this.api.teamApi, "teamsPost");
let teamPostStub = stub(this.api.teamApi, "teamsTeamIdUsersUserIdPost");
getPropStub.withArgs("current_login").returns("user1");
getPropStub.withArgs("current_user_type").returns("user");
createTeamStub.callsFake((teamObj, callback) => {
callback(null, null, false);
})
getUserInfoStub.callsFake((userId, callback) => {
callback(null, this.userObj, { body: this.userObj });
});
teamPostStub.callsFake((teamId, userId, roleId, callback) => {
callback(null, null, {body: {team: this.teamObj}});
});
await this.user.createTeam("team1");
setPropStub.restore();
getPropStub.restore();
getUserInfoStub.restore();
teamPostStub.restore();
consoleLogStub.restore();
assert.calledWith(consoleLogStub, "Team team1 exist !");
}
}