SandboxedModule = require('sandboxed-module')
should = require('chai').should()
sinon = require 'sinon'
assert = require("chai").assert
modulePath = "../../../../app/js/Features/Subscription/SubscriptionGroupController"
MockResponse = require "../helpers/MockResponse"

describe "SubscriptionGroupController", ->

	beforeEach ->
		@user = {_id:"!@312431",email:"user@email.com"}
		@adminUserId = "123jlkj"
		@subscription_id = "123434325412"
		@user_email = "bob@gmail.com"
		@req =
			session:
				user:
					_id: @adminUserId
					email:@user_email
			params:
				subscription_id:@subscription_id
			query:{}
		@subscription = {}
		@GroupHandler =
			addUserToGroup: sinon.stub().callsArgWith(2, null, @user)
			removeUserFromGroup: sinon.stub().callsArgWith(2)
			isUserPartOfGroup: sinon.stub()
			getPopulatedListOfMembers: sinon.stub().callsArgWith(1, null, [@user])
		@SubscriptionLocator = getUsersSubscription: sinon.stub().callsArgWith(1, null, @subscription)
		@AuthenticationController =
			getLoggedInUserId: (req) -> req.session.user._id
			getSessionUser: (req) -> req.session.user

		@SubscriptionDomainHandler =
			findDomainLicenceBySubscriptionId:sinon.stub()

		@OneTimeTokenHandler =
			getValueFromTokenAndExpire:sinon.stub()


		@ErrorsController =
			notFound:sinon.stub()

		@Controller = SandboxedModule.require modulePath, requires:
			"./SubscriptionGroupHandler":@GroupHandler
			"logger-sharelatex": log:->
			"./SubscriptionLocator": @SubscriptionLocator
			"./SubscriptionDomainHandler":@SubscriptionDomainHandler
			"../Errors/ErrorController":@ErrorsController
			'../Authentication/AuthenticationController': @AuthenticationController


		@token = "super-secret-token"


	describe "addUserToGroup", ->

		it "should use the admin id for the logged in user and take the email address from the body", (done)->
			newEmail = " boB@gmaiL.com "
			@req.body = email: newEmail
			res =
				json : (data)=>
					@GroupHandler.addUserToGroup.calledWith(@adminUserId, "bob@gmail.com").should.equal true
					data.user.should.deep.equal @user
					done()
			@Controller.addUserToGroup @req, res


	describe "removeUserFromGroup", ->
		it "should use the admin id for the logged in user and take the user id from the params", (done)->
			userIdToRemove = "31231"
			@req.params = user_id: userIdToRemove

			res =
				send : =>
					@GroupHandler.removeUserFromGroup.calledWith(@adminUserId, userIdToRemove).should.equal true
					done()
			@Controller.removeUserFromGroup @req, res

	describe "renderSubscriptionGroupAdminPage", ->
		it "should redirect you if you don't have a group account", (done)->
			@subscription.groupPlan = false

			res =
				redirect : (path)=>
					path.should.equal("/user/subscription")
					done()
			@Controller.renderSubscriptionGroupAdminPage @req, res

		it "should redirect you don't have a subscription", (done)->
			@SubscriptionLocator.getUsersSubscription = sinon.stub().callsArgWith(1)

			res =
				redirect : (path)=>
					path.should.equal("/user/subscription")
					done()
			@Controller.renderSubscriptionGroupAdminPage @req, res

	describe "exportGroupCsv", ->

		beforeEach ->
			@subscription.groupPlan = true
			@res = new MockResponse()
			@res.contentType = sinon.stub()
			@res.header = sinon.stub()
			@res.send = sinon.stub()
			@Controller.exportGroupCsv @req, @res

		it "should set the correct content type on the request", ->
			@res.contentType
				.calledWith("text/csv")
				.should.equal true

		it "should name the exported csv file", ->
			@res.header
				.calledWith(
					"Content-Disposition",
					"attachment; filename=Group.csv")
				.should.equal true

		it "should export the correct csv", ->
			@res.send
				.calledWith("user@email.com\n")
				.should.equal true
