From acebe5918dc77b1e10a8b01f0c3193b65b1b9437 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Tue, 28 Apr 2015 12:49:39 +0200 Subject: [PATCH] projects.service tests --- app/modules/projects/projects.service.coffee | 15 +- .../projects/projects.service.spec.coffee | 149 ++++++++++++++++++ 2 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 app/modules/projects/projects.service.spec.coffee diff --git a/app/modules/projects/projects.service.coffee b/app/modules/projects/projects.service.coffee index 0248b8c6..f8d9a474 100644 --- a/app/modules/projects/projects.service.coffee +++ b/app/modules/projects/projects.service.coffee @@ -2,18 +2,19 @@ taiga = @.taiga groupBy = @.taiga.groupBy class ProjectsService extends taiga.Service - @.$inject = ["$q", "$tgResources", "$rootScope", "$projectUrl", "tgLightboxFactory"] + @.$inject = ["$tgResources", "$rootScope", "$projectUrl", "tgLightboxFactory"] - constructor: (@q, @rs, @rootScope, @projectUrl, @lightboxFactory) -> + constructor: (@rs, @rootScope, @projectUrl, @lightboxFactory) -> @.projects = Immutable.Map() @.projectsById = Immutable.Map() - @.inProgress = false + @._inProgress = false @.projectsPromise = null @.fetchProjects() fetchProjects: -> - if not @.inProgress - @.inProgress = true + if not @._inProgress + @._inProgress = true + @.projectsPromise = @rs.projects.listByMember(@rootScope.user?.id).then (projects) => for project in projects project.url = @projectUrl.get(project) @@ -25,10 +26,10 @@ class ProjectsService extends taiga.Service @.projectsById = Immutable.fromJS(groupBy(projects, (p) -> p.id)) + @._inProgress = false + return @.projects - @.projectsPromise.then () => - @.inProgress = false return @.projectsPromise diff --git a/app/modules/projects/projects.service.spec.coffee b/app/modules/projects/projects.service.spec.coffee new file mode 100644 index 00000000..5b3f95ac --- /dev/null +++ b/app/modules/projects/projects.service.spec.coffee @@ -0,0 +1,149 @@ +describe "tgProjects", -> + projectsService = provide = null + mocks = {} + + _mockResources = () -> + mocks.resources = {} + + mocks.resources.projects = { + listByMember: sinon.stub() + } + + mocks.thenStub = sinon.stub() + mocks.resources.projects.listByMember.withArgs(10).returns({ + then: mocks.thenStub + }) + + provide.value "$tgResources", mocks.resources + + _mockRootScope = () -> + provide.value "$rootScope", {user: {id: 10}} + + _mockProjectUrl = () -> + mocks.projectUrl = {get: sinon.stub()} + + mocks.projectUrl.get = (project) -> + return "url-" + project.id + + provide.value "$projectUrl", mocks.projectUrl + + _mockLightboxFactory = () -> + mocks.lightboxFactory = { + create: sinon.stub() + } + + provide.value "tgLightboxFactory", mocks.lightboxFactory + + _inject = (callback) -> + inject (_tgProjects_) -> + projectsService = _tgProjects_ + callback() if callback + + _mocks = () -> + module ($provide) -> + provide = $provide + _mockResources() + _mockRootScope() + _mockProjectUrl() + _mockLightboxFactory() + + return null + + _setup = -> + _mocks() + + beforeEach -> + module "taigaProjects" + _setup() + _inject() + + describe "fetch items", -> + projects = [] + + beforeEach -> + projects = [ + {"id": 1}, + {"id": 2}, + {"id": 3}, + {"id": 4}, + {"id": 5}, + {"id": 6}, + {"id": 7}, + {"id": 8}, + {"id": 9}, + {"id": 10}, + {"id": 11}, + {"id": 12}, + ] + + it "all & recents filled", () -> + mocks.thenStub.callArg(0, projects) + + expect(projectsService.projects.get("all").toJS()).to.be.eql(projects) + expect(projectsService.projects.get("recents").toJS()).to.be.eql(projects.slice(0, 10)) + + it "_inProgress change to false when tgResources end", () -> + expect(projectsService._inProgress).to.be.true + + mocks.thenStub.callArg(0, projects) + + expect(projectsService._inProgress).to.be.false + + it "_inProgress prevent new ajax calls", () -> + projectsService.fetchProjects() + projectsService.fetchProjects() + + mocks.thenStub.callArg(0, projects) + + expect(mocks.resources.projects.listByMember).have.been.calledOnce + + it "group projects by id", () -> + mocks.thenStub.callArg(0, projects) + + expect(projectsService.projectsById.size).to.be.equal(12) + expect(projectsService.projectsById.toJS()[1].id).to.be.equal(projects[0].id) + + it "add urls in the project object", () -> + mocks.thenStub.callArg(0, projects) + + expect(projectsService.projectsById.toJS()[1].url).to.be.equal("url-1") + expect(projectsService.projects.get("all").toJS()[0].url).to.be.equal("url-1") + expect(projectsService.projects.get("recents").toJS()[0].url).to.be.equal("url-1") + + it "newProject, create the wizard lightbox", () -> + projectsService.newProject() + + expect(mocks.lightboxFactory.create).to.have.been.calledWith("tg-lb-create-project", { + "class": "wizard-create-project" + }) + + it "bulkUpdateProjectsOrder and then fetch projects again", () -> + projects_order = [ + {"id": 8}, + {"id": 2}, + {"id": 3}, + {"id": 9}, + {"id": 1}, + {"id": 4}, + {"id": 10}, + {"id": 5}, + {"id": 6}, + {"id": 7}, + {"id": 11}, + {"id": 12}, + ] + + thenStub = sinon.stub() + + mocks.resources.projects.bulkUpdateOrder = sinon.stub() + mocks.resources.projects.bulkUpdateOrder.withArgs(projects_order).returns({ + then: thenStub + }) + + projectsService.fetchProjects = sinon.stub() + + projectsService.bulkUpdateProjectsOrder(projects_order) + + thenStub.callArg(0) + + expect(projectsService.fetchProjects).to.have.been.calledOnce