taiga-front/app/modules/services/current-user.service.spec.c...

430 lines
12 KiB
CoffeeScript

###
# Copyright (C) 2014-2016 Taiga Agile LLC <taiga@taiga.io>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# File: current-user.service.spec.coffee
###
describe "tgCurrentUserService", ->
currentUserService = provide = null
mocks = {}
_mockTgStorage = () ->
mocks.storageService = {
get: sinon.stub()
}
provide.value "$tgStorage", mocks.storageService
_mockProjectsService = () ->
mocks.projectsService = {
getProjectsByUserId: sinon.stub()
bulkUpdateProjectsOrder: sinon.stub()
}
provide.value "tgProjectsService", mocks.projectsService
_mockResources = () ->
mocks.resources = {
user: {
setUserStorage: sinon.stub(),
getUserStorage: sinon.stub(),
createUserStorage: sinon.stub()
}
}
provide.value "tgResources", mocks.resources
_inject = (callback) ->
inject (_tgCurrentUserService_) ->
currentUserService = _tgCurrentUserService_
callback() if callback
_mocks = () ->
module ($provide) ->
provide = $provide
_mockTgStorage()
_mockProjectsService()
_mockResources()
return null
_setup = ->
_mocks()
beforeEach ->
module "taigaCommon"
_setup()
_inject()
describe "get user", () ->
it "return the user if it is defined", () ->
currentUserService._user = 123
expect(currentUserService.getUser()).to.be.equal(123)
it "get user form storage if it is not defined", () ->
user = {id: 1, name: "fake1"}
currentUserService.setUser = sinon.spy()
mocks.storageService.get.withArgs("userInfo").returns(user)
_user = currentUserService.getUser()
expect(currentUserService.setUser).to.be.calledOnce
it "set user and load user info", (done) ->
user = Immutable.fromJS({id: 1, name: "fake1"})
projects = Immutable.fromJS([
{id: 1, name: "fake1"},
{id: 2, name: "fake2"},
{id: 3, name: "fake3"},
{id: 4, name: "fake4"},
{id: 5, name: "fake5"}
])
mocks.projectsService.getProjectsByUserId = sinon.stub()
mocks.projectsService.getProjectsByUserId.withArgs(user.get("id")).promise().resolve(projects)
currentUserService.setUser(user).then () ->
expect(currentUserService._user).to.be.equal(user)
expect(currentUserService.projects.get("all").size).to.be.equal(5)
expect(currentUserService.projects.get("recents").size).to.be.equal(5)
expect(currentUserService.projectsById.size).to.be.equal(5)
expect(currentUserService.projectsById.get("3").get("name")).to.be.equal("fake3")
done()
it "bulkUpdateProjectsOrder and reload projects", (done) ->
fakeData = [{id: 1, id: 2}]
currentUserService.loadProjects = sinon.stub()
mocks.projectsService.bulkUpdateProjectsOrder.withArgs(fakeData).promise().resolve()
currentUserService.bulkUpdateProjectsOrder(fakeData).then () ->
expect(currentUserService.loadProjects).to.be.callOnce
done()
it "loadProject and set it", (done) ->
user = Immutable.fromJS({id: 1, name: "fake1"})
project = Immutable.fromJS({id: 2, name: "fake2"})
currentUserService._user = user
currentUserService.setProjects = sinon.stub()
mocks.projectsService.getProjectsByUserId.withArgs(1).promise().resolve(project)
currentUserService.loadProjects().then () ->
expect(currentUserService.setProjects).to.have.been.calledWith(project)
done()
it "setProject", () ->
projectsRaw = [
{id: 1, name: "fake1"},
{id: 2, name: "fake2"},
{id: 3, name: "fake3"},
{id: 4, name: "fake4"}
]
projectsRawById = {
1: {id: 1, name: "fake1"},
2: {id: 2, name: "fake2"},
3: {id: 3, name: "fake3"},
4: {id: 4, name: "fake4"}
}
projects = Immutable.fromJS(projectsRaw)
currentUserService.setProjects(projects)
expect(currentUserService.projects.get('all').toJS()).to.be.eql(projectsRaw)
expect(currentUserService.projects.get('recents').toJS()).to.be.eql(projectsRaw)
expect(currentUserService.projectsById.toJS()).to.be.eql(projectsRawById)
it "is authenticated", () ->
currentUserService.getUser = sinon.stub()
currentUserService.getUser.returns({})
expect(currentUserService.isAuthenticated()).to.be.true
currentUserService.getUser.returns(null)
expect(currentUserService.isAuthenticated()).to.be.false
it "remove user", () ->
currentUserService._user = true
currentUserService.removeUser()
expect(currentUserService._user).to.be.null
it "disable joyride", () ->
currentUserService.disableJoyRide()
expect(mocks.resources.user.setUserStorage).to.have.been.calledWith('joyride', {
backlog: false,
kanban: false,
dashboard: false
});
it "load joyride config", (done) ->
mocks.resources.user.getUserStorage.withArgs('joyride').promise().resolve(true)
currentUserService.loadJoyRideConfig().then (config) ->
expect(config).to.be.true
done()
it "create default joyride config", (done) ->
mocks.resources.user.getUserStorage.withArgs('joyride').promise().reject(new Error('error'))
currentUserService.loadJoyRideConfig().then (config) ->
joyride = {
backlog: true,
kanban: true,
dashboard: true
}
expect(mocks.resources.user.createUserStorage).to.have.been.calledWith('joyride', joyride)
expect(config).to.be.eql(joyride)
done()
it "the user can't create private projects if they reach the maximum number of private projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_private_projects: 1,
total_private_projects: 1
})
currentUserService._user = user
result = currentUserService.canCreatePrivateProjects()
expect(result).to.be.eql({
valid: false,
reason: 'max_private_projects',
type: 'private_project'
})
it "the user can create private projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_private_projects: 10,
total_private_projects: 1,
max_memberships_private_projects: 20
})
currentUserService._user = user
result = currentUserService.canCreatePrivateProjects(10)
expect(result).to.be.eql({
valid: true
})
it "the user can't create public projects if they reach the maximum number of private projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_public_projects: 1,
total_public_projects: 1
})
currentUserService._user = user
result = currentUserService.canCreatePublicProjects(0)
expect(result).to.be.eql({
valid: false,
reason: 'max_public_projects',
type: 'public_project'
})
it "the user can create public projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_public_projects: 10,
total_public_projects: 1,
max_memberships_public_projects: 20
})
currentUserService._user = user
result = currentUserService.canCreatePublicProjects(10)
expect(result).to.be.eql({
valid: true
})
it "the user can own public project", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_public_projects: 10,
total_public_projects: 1,
max_memberships_public_projects: 20
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: false
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: true
})
it "the user can't own public project because of max projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_public_projects: 1,
total_public_projects: 1,
max_memberships_public_projects: 20
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: false
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: false
reason: 'max_public_projects'
type: 'public_project'
})
it "the user can't own public project because of max memberships", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_public_projects: 5,
total_public_projects: 1,
max_memberships_public_projects: 4
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: false
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: false
reason: 'max_members_public_projects'
type: 'public_project'
})
it "the user can own private project", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_private_projects: 10,
total_private_projects: 1,
max_memberships_private_projects: 20
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: true
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: true
})
it "the user can't own private project because of max projects", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_private_projects: 1,
total_private_projects: 1,
max_memberships_private_projects: 20
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: true
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: false
reason: 'max_private_projects'
type: 'private_project'
})
it "the user can't own private project because of max memberships", () ->
user = Immutable.fromJS({
id: 1,
name: "fake1",
max_private_projects: 10,
total_private_projects: 1,
max_memberships_private_projects: 4
})
currentUserService._user = user
project = Immutable.fromJS({
id: 2,
name: "fake2",
total_memberships: 5,
is_private: true
})
result = currentUserService.canOwnProject(project)
expect(result).to.be.eql({
valid: false
reason: 'max_members_private_projects'
type: 'private_project'
})