(function(sandbox) {
    'use strict';
    require(["jquery", "backbone", "cms/js/main", "edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers", "jquery.cookie"],
            function($, Backbone, main, AjaxHelpers) {
        describe("CMS", function() {
            it("should initialize URL", function() {
                expect(window.CMS.URL).toBeDefined();
            });
        });
        describe("main helper", function() {
            beforeEach(function() {
                this.previousAjaxSettings = $.extend(true, {}, $.ajaxSettings);
                spyOn($, "cookie").and.callFake(function(param) {
                    if (param === "csrftoken") {
                        return "stubCSRFToken";
                    }
                });
                return main();
            });
            afterEach(function() {
                $.ajaxSettings = this.previousAjaxSettings;
                return $.ajaxSettings;
            });
            it("turn on Backbone emulateHTTP", function() {
                expect(Backbone.emulateHTTP).toBeTruthy();
            });
            it("setup AJAX CSRF token", function() {
                expect($.ajaxSettings.headers["X-CSRFToken"]).toEqual("stubCSRFToken");
            });
        });
        describe("AJAX Errors", function() {
            var server;
            server = null;
            beforeEach(function() {
                appendSetFixtures(sandbox({
                    id: "page-notification"
                }));
            });
            afterEach(function() {
                return server && server.restore();
            });
            it("successful AJAX request does not pop an error notification", function() {
                server = AjaxHelpers.server([
                    200, {
                        "Content-Type": "application/json"
                    }, "{}"
                ]);
                expect($("#page-notification")).toBeEmpty();
                $.ajax("/test");
                expect($("#page-notification")).toBeEmpty();
                server.respond();
                expect($("#page-notification")).toBeEmpty();
            });
            it("AJAX request with error should pop an error notification", function() {
                server = AjaxHelpers.server([
                    500, {
                        "Content-Type": "application/json"
                    }, "{}"
                ]);
                $.ajax("/test");
                server.respond();
                expect($("#page-notification")).not.toBeEmpty();
                expect($("#page-notification")).toContainElement('div.wrapper-notification-error');
            });
            it("can override AJAX request with error so it does not pop an error notification", function() {
                server = AjaxHelpers.server([
                    500, {
                        "Content-Type": "application/json"
                    }, "{}"
                ]);
                $.ajax({
                    url: "/test",
                    notifyOnError: false
                });
                server.respond();
                expect($("#page-notification")).toBeEmpty();
            });
        });
    });

}).call(this, sandbox);  //jshint ignore:line
