csrf.test.js 4.04 KB
/*
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2015 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

/* eslint max-nested-callbacks: [2, 10]*/

/* globals describe, expect, beforeEach, afterEach, it, xit, sinon */
define(['screens/player/shared/csrf'], function(CSRFSupport) {
    'use strict';

    var server;

    var fakeServerURL = 'http://fake.server.com';

    var fakeData = {
        token: 'test-token-1234'
    };

    var fakeResponse = [200, { 'Content-Type': 'application/json'}, JSON.stringify(fakeData)];

    function validateToken(token) {
        expect(token).equals(fakeData.token);
    }

    beforeEach(function() {
        server = sinon.fakeServer.create();
        server.autoRespond = true;
        server.numRequests = 0;
        server.respondWith(
            'GET',
            fakeServerURL + '/libs/granite/csrf/token.json',
            function(request) {
                server.numRequests++;
                request.respond.apply(request, fakeResponse);
            }
        );

    });

    afterEach(function() {
        server.restore();
    });

    describe('screens/player/shared/csrf', function() {

        it('should be defined', function() {
            // noinspection BadExpressionStatementJS
            expect(CSRFSupport).to.exist;
        });

        it('should retrieve the token', function(done) {
            var csrf = new CSRFSupport({
                serverURL: fakeServerURL
            });
            csrf.getToken()
                .then(validateToken)
                .then(done)
                .catch(done);
        });

        it('should use the cached token', function(done) {
            var csrf = new CSRFSupport({
                serverURL: fakeServerURL
            });
            csrf.getToken()
                .then(validateToken)
                .then(function() {
                    return csrf.getToken();
                })
                .then(validateToken)
                .then(function() {
                    if (server.numRequests > 1) {
                        done(new Error('server should only be requested once. ' + server.numRequests + ' requests'));
                    } else {
                        done();
                    }
                })
                .catch(done);
            server.respond();
        });

        it('should refetch the token after it is expired', function(done) {
            var csrf = new CSRFSupport({
                serverURL: fakeServerURL,
                expirationTime: -1000 // compensate for fast running tests.
            });
            csrf.getToken()
                .then(validateToken)
                .then(function() {
                    return csrf.getToken();
                })
                .then(validateToken)
                .then(function() {
                    if (server.numRequests < 2) {
                        done(new Error('token should be refetched. ' + server.numRequests + ' requests'));
                    } else {
                        done();
                    }
                })
                .catch(done);
            server.respond();
        });

        xit('prepareXHR()', function() {
            var FAKE_TOKEN = 'FOO';
            var spy = sinon.spy();

            new CSRFSupport({
                serverURL: fakeServerURL
            }).prepareXHR.call({
                getToken: function() {
                    return Promise.resolve(FAKE_TOKEN);
                }
            }, {
                setRequestHeader: spy
            });
            spy.should.have.been.calledOnce;
        });

    });
});