define([
    'jquery',
    'jquery.ajax-retry',
    'js/commerce/views/receipt_view',
    'edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers'
],
    function($, AjaxRetry, ReceiptView, AjaxHelpers) {
        'use strict';
        describe('edx.commerce.ReceiptView', function() {
            var data, courseResponseData, providerResponseData, mockRequests, mockRender, createReceiptView,
                userResponseData;

            createReceiptView = function() {
                return new ReceiptView({el: $('#receipt-container')});
            };

            mockRequests = function(requests, method, apiUrl, responseData) {
                AjaxHelpers.expectRequest(requests, method, apiUrl);
                AjaxHelpers.respondWithJson(requests, responseData);
            };

            mockRender = function(useEcommerceOrderNumber, isVerified) {
                var requests, view, orderUrlFormat;
                requests = AjaxHelpers.requests(this);
                $('#receipt-container').data('verified', isVerified);
                view = createReceiptView();
                view.useEcommerceApi = true;
                if (useEcommerceOrderNumber) {
                    view.ecommerceOrderNumber = 'EDX-123456';
                    orderUrlFormat = '/api/commerce/v1/orders/EDX-123456/';
                }
                else {
                    view.ecommerceBasketId = 'EDX-123456';
                    orderUrlFormat = '/api/commerce/v0/baskets/EDX-123456/order/';
                }
                view.render();
                mockRequests(requests, 'GET', orderUrlFormat, data);

                mockRequests(
                    requests, 'GET', '/commerce/checkout/verification_status/?course_id=' +
                    encodeURIComponent('course-v1:edx+dummy+2015_T3'), {is_verification_required: true}
                );

                mockRequests(
                    requests, 'GET', '/api/courses/v1/courses/course-v1:edx+dummy+2015_T3/', courseResponseData
                );

                mockRequests(
                    requests, 'GET', '/api/user/v1/accounts/user-1', userResponseData
                );

                mockRequests(requests, 'GET', '/api/credit/v1/providers/edx/', providerResponseData);
                return view;
            };

            beforeEach(function() {
                var receiptFixture, providerFixture;
                // Stub analytics tracking
                window.analytics = jasmine.createSpyObj('analytics', ['page', 'track', 'trackLink']);

                loadFixtures('js/fixtures/commerce/checkout_receipt.html');

                receiptFixture = readFixtures('templates/commerce/receipt.underscore');
                providerFixture = readFixtures('templates/commerce/provider.underscore');
                appendSetFixtures(
                    '<script id=\"receipt-tpl\" type=\"text/template\" >' + receiptFixture + '</script>' +
                    '<script id=\"provider-tpl\" type=\"text/template\" >' + providerFixture + '</script>'
                );

                data = {
                    'status': 'Open',
                    'billed_to': {
                        'city': 'dummy city',
                        'first_name': 'john',
                        'last_name': 'doe',
                        'country': 'AL',
                        'line2': 'line2',
                        'line1': 'line1',
                        'state': '',
                        'postcode': '12345'
                    },
                    'lines': [
                        {
                            'status': 'Open',
                            'unit_price_excl_tax': '10.00',
                            'product': {
                                'attribute_values': [
                                    {
                                        'name': 'certificate_type',
                                        'value': 'verified'
                                    },
                                    {
                                        'name': 'course_key',
                                        'code': 'course_key',
                                        'value': 'course-v1:edx+dummy+2015_T3'
                                    },
                                    {
                                        'name': 'credit_provider',
                                        'value': 'edx'
                                    }
                                ],
                                'stockrecords': [
                                    {
                                        'price_currency': 'USD',
                                        'product': 123,
                                        'partner_sku': '1234ABC',
                                        'partner': 1,
                                        'price_excl_tax': '10.00',
                                        'id': 123
                                    }
                                ],
                                'product_class': 'Seat',
                                'title': 'Dummy title',
                                'url': 'https://ecom.edx.org/api/v2/products/123/',
                                'price': '10.00',
                                'expires': null,
                                'is_available_to_buy': true,
                                'id': 123,
                                'structure': 'child'
                            },
                            'line_price_excl_tax': '10.00',
                            'description': 'dummy description',
                            'title': 'dummy title',
                            'quantity': 1
                        }
                    ],
                    'number': 'EDX-123456',
                    'date_placed': '2016-01-01T01:01:01Z',
                    'currency': 'USD',
                    'total_excl_tax': '10.00'
                };
                providerResponseData = {
                    'id': 'edx',
                    'display_name': 'edX',
                    'url': 'http://www.edx.org',
                    'status_url': 'http://www.edx.org/status',
                    'description': 'Nothing',
                    'enable_integration': false,
                    'fulfillment_instructions': '',
                    'thumbnail_url': 'http://edx.org/thumbnail.png'
                };
                courseResponseData = {
                    'id': 'course-v1:edx+dummy+2015_T3',
                    'name': 'receipt test',
                    'category': 'course',
                    'org': 'edx',
                    'run': '2015_T2',
                    'course': 'CS420',
                    'uri': 'http://test.com/api/courses/v1/courses/course-v1:edx+dummy+2015_T3/',
                    'image_url': '/test.jpg',
                    'start': '2030-01-01T00:00:00Z',
                    'end': null
                };
                userResponseData = {
                    'username': 'user-1',
                    'name': 'full name'
                };
            });

            it('sends analytic event when verified receipt is rendered', function() {
                mockRender(true, 'True');
                expect(window.analytics.track).toHaveBeenCalledWith(
                    'Completed Order',
                    {
                        orderId: 'EDX-123456',
                        total: '10.00',
                        currency: 'USD'
                    }
                );
            });

            it('sends analytic event when non verified receipt is rendered', function() {
                mockRender(true, 'False');
                expect(window.analytics.track).toHaveBeenCalledWith(
                    'Completed Order',
                    {
                        orderId: 'EDX-123456',
                        total: '10.00',
                        currency: 'USD'
                    }
                );
            });

            it('renders a receipt correctly with Ecommerce Order Number', function() {
                var view;

                view = mockRender(true, 'True');
                expect(view.$('.course_name_placeholder').text()).toContain('receipt test');
            });

            it('renders a receipt correctly with Ecommerce Basket Id', function() {
                var view;

                view = mockRender(false, 'True');
                expect(view.$('.course_name_placeholder').text()).toContain('receipt test');
            });
        });
    }
);
