define(['jquery', 'js/factories/xblock_validation', 'js/common_helpers/template_helpers'],
    function($, XBlockValidationFactory, TemplateHelpers) {

        describe('XBlockValidationFactory', function() {
            var messageDiv;

            beforeEach(function () {
                TemplateHelpers.installTemplate('xblock-validation-messages');
                appendSetFixtures($('<div class="messages"></div>'));
                messageDiv = $('.messages');
            });

            it('Does not attach a view if messages is empty', function() {
                XBlockValidationFactory({"empty": true}, false, false, messageDiv);
                expect(messageDiv.children().length).toEqual(0);
            });

            it('Does attach a view if messages are not empty', function() {
                XBlockValidationFactory({"empty": false}, false, false, messageDiv);
                expect(messageDiv.children().length).toEqual(1);
            });

            it('Passes through the root property to the view.', function() {
                var noContainerContent = "no-container-content";

                var notConfiguredMessages = {
                    "empty": false,
                    "summary": {"text": "my summary", "type": "not-configured"},
                    "messages": [],
                    "xblock_id": "id"
                };
                // Root is false, will not add noContainerContent.
                XBlockValidationFactory(notConfiguredMessages, true, false, messageDiv);
                expect(messageDiv.find('.validation')).not.toHaveClass(noContainerContent);

                // Root is true, will add noContainerContent.
                XBlockValidationFactory(notConfiguredMessages, true, true, messageDiv);
                expect(messageDiv.find('.validation')).toHaveClass(noContainerContent);
            });

            describe('Controls display of detailed messages based on url and root property', function() {
                var messagesWithSummary, checkDetailedMessages;

                beforeEach(function () {
                    messagesWithSummary = {
                        "empty": false,
                        "summary": {"text": "my summary"},
                        "messages": [{"text": "one", "type": "warning"}, {"text": "two", "type": "error"}],
                        "xblock_id": "id"
                    };
                });

                checkDetailedMessages = function (expectedDetailedMessages) {
                    expect(messageDiv.children().length).toEqual(1);
                    expect(messageDiv.find('.xblock-message-item').length).toBe(expectedDetailedMessages);
                };

                it('Does not show details if xblock has an editing URL and it is not rendered as root', function() {
                    XBlockValidationFactory(messagesWithSummary, true, false, messageDiv);
                    checkDetailedMessages(0);
                });

                it('Shows details if xblock does not have its own editing URL, regardless of root value', function() {
                    XBlockValidationFactory(messagesWithSummary, false, false, messageDiv);
                    checkDetailedMessages(2);

                    XBlockValidationFactory(messagesWithSummary, false, true, messageDiv);
                    checkDetailedMessages(2);
                });

                it('Shows details if xblock has its own editing URL and is rendered as root', function() {
                    XBlockValidationFactory(messagesWithSummary, true, true, messageDiv);
                    checkDetailedMessages(2);
                });
            });
        });
    }
);