define(['js/models/xblock_validation'], function(XBlockValidationModel) { var verifyModel; verifyModel = function(model, expected_empty, expected_summary, expected_messages, expected_xblock_id) { expect(model.get('empty')).toBe(expected_empty); expect(model.get('summary')).toEqual(expected_summary); expect(model.get('messages')).toEqual(expected_messages); expect(model.get('xblock_id')).toBe(expected_xblock_id); }; describe('XBlockValidationModel', function() { it('handles empty variable', function() { verifyModel(new XBlockValidationModel({parse: true}), true, {}, [], null); verifyModel(new XBlockValidationModel({'empty': true}, {parse: true}), true, {}, [], null); // It is assumed that the "empty" state on the JSON object passed in is correct // (no attempt is made to correct other variables based on empty==true). verifyModel( new XBlockValidationModel( {'empty': true, 'messages': [{'text': 'Bad JSON case'}], 'xblock_id': 'id'}, {parse: true} ), true, {}, [{'text': 'Bad JSON case'}], 'id' ); }); it('creates a summary if not defined', function() { // Single warning message. verifyModel( new XBlockValidationModel({ 'empty': false, 'xblock_id': 'id' }, {parse: true}), false, {'text': 'This component has validation issues.', 'type': 'warning'}, [], 'id' ); // Two messages that compute to a "warning" state in the summary. verifyModel( new XBlockValidationModel({ 'empty': false, 'messages': [{'text': 'one', 'type': 'not-configured'}, {'text': 'two', 'type': 'warning'}], 'xblock_id': 'id' }, {parse: true}), false, {'text': 'This component has validation issues.', 'type': 'warning'}, [{'text': 'one', 'type': 'not-configured'}, {'text': 'two', 'type': 'warning'}], 'id' ); // Two messages, with one of them "error", resulting in an "error" state in the summary. verifyModel( new XBlockValidationModel({ 'empty': false, 'messages': [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'xblock_id': 'id' }, {parse: true}), false, {'text': 'This component has validation issues.', 'type': 'error'}, [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'id' ); }); it('respects summary properties that are defined', function() { // Summary already present (both text and type), no messages. verifyModel( new XBlockValidationModel({ 'empty': false, 'xblock_id': 'id', 'summary': {'text': 'my summary', 'type': 'custom type'} }, {parse: true}), false, {'text': 'my summary', 'type': 'custom type'}, [], 'id' ); // Summary text present, but not type (will get default value of warning). verifyModel( new XBlockValidationModel({ 'empty': false, 'xblock_id': 'id', 'summary': {'text': 'my summary'} }, {parse: true}), false, {'text': 'my summary', 'type': 'warning'}, [], 'id' ); // Summary type present, but not text. verifyModel( new XBlockValidationModel({ 'empty': false, 'summary': {'type': 'custom type'}, 'messages': [{'text': 'one', 'type': 'not-configured'}, {'text': 'two', 'type': 'warning'}], 'xblock_id': 'id' }, {parse: true}), false, {'text': 'This component has validation issues.', 'type': 'custom type'}, [{'text': 'one', 'type': 'not-configured'}, {'text': 'two', 'type': 'warning'}], 'id' ); // Summary text present, type will be computed as error. verifyModel( new XBlockValidationModel({ 'empty': false, 'summary': {'text': 'my summary'}, 'messages': [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'xblock_id': 'id' }, {parse: true}), false, {'text': 'my summary', 'type': 'error'}, [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'id' ); }); it('clears messages if showSummaryOnly is true', function() { verifyModel( new XBlockValidationModel({ 'empty': false, 'xblock_id': 'id', 'summary': {'text': 'my summary'}, 'messages': [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'showSummaryOnly': true }, {parse: true}), false, {'text': 'my summary', 'type': 'error'}, [], 'id' ); verifyModel( new XBlockValidationModel({ 'empty': false, 'xblock_id': 'id', 'summary': {'text': 'my summary'}, 'messages': [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'showSummaryOnly': false }, {parse: true}), false, {'text': 'my summary', 'type': 'error'}, [{'text': 'one', 'type': 'warning'}, {'text': 'two', 'type': 'error'}], 'id' ); }); }); } );