define(['js/models/license'], function(LicenseModel) {
    describe('License model constructor', function() {
        it('accepts no arguments', function() {
            var model = new LicenseModel();
            expect(model.get('type')).toBeNull();
            expect(model.get('options')).toEqual({});
            expect(model.get('custom')).toBeFalsy();
        });

        it('accepts normal arguments', function() {
            var model = new LicenseModel({
                type: 'creative-commons',
                options: {'fake-boolean': true, version: 'your momma'}
            });
            expect(model.get('type')).toEqual('creative-commons');
            expect(model.get('options')).toEqual({'fake-boolean': true, version: 'your momma'});
        });

        it('accepts a license string argument', function() {
            var model = new LicenseModel({asString: 'all-rights-reserved'});
            expect(model.get('type')).toEqual('all-rights-reserved');
            expect(model.get('options')).toEqual({});
            expect(model.get('custom')).toBeFalsy();
        });

        it('accepts a custom license argument', function() {
            var model = new LicenseModel({asString: 'Mozilla Public License 2.0'});
            expect(model.get('type')).toBeNull();
            expect(model.get('options')).toEqual({});
            expect(model.get('custom')).toEqual('Mozilla Public License 2.0');
        });
    });

    describe('License model', function() {
        beforeEach(function() {
            this.model = new LicenseModel();
        });

        it('can parse license strings', function() {
            this.model.setFromString('creative-commons: BY');
            expect(this.model.get('type')).toEqual('creative-commons');
            expect(this.model.get('options')).toEqual({BY: true});
            expect(this.model.get('custom')).toBeFalsy();
        });

        it('can stringify a null license', function() {
            expect(this.model.toString()).toEqual('');
        });

        it('can stringify a simple license', function() {
            this.model.set('type', 'foobie thinger');
            expect(this.model.toString()).toEqual('foobie thinger');
        });

        it('can stringify a license with options', function() {
            this.model.set({
                type: 'abc',
                options: {ping: 'pong', bing: true, buzz: true, beep: false}}
            );
            expect(this.model.toString()).toEqual('abc: ping=pong bing buzz');
        });

        it('can stringify a custom license', function() {
            this.model.set({
                type: "doesn't matter",
                options: {ignore: 'me'},
                custom: 'this is my super cool license'
            });
            expect(this.model.toString()).toEqual('this is my super cool license');
        });
    });
});
