UNPKG

fuelux

Version:

Base Fuel UX styles and controls

440 lines (353 loc) 18.2 kB
/*global QUnit:false, module:false, test:false, asyncTest:false, expect:false*/ /*global start:false, stop:false ok:false, equal:false, notEqual:false, deepEqual:false*/ /*global notDeepEqual:false, strictEqual:false, notStrictEqual:false, raises:false*/ define( function ( require ) { var QUnit = require('qunit'); var $ = require( "jquery" ); var html = require( "text!test/markup/datepicker-markup.html!strip" ); require( "bootstrap" ); require( "moment" ); require( "fuelux/datepicker" ); // Require('test/datepicker-test'); //this ensures the non-moment tests run before the moment tests function uaMatch( ua ) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf( "compatible" ) < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; } var UA = uaMatch( navigator.userAgent ); var runTestsBoolean = true; if ( UA.browser === "msie" ) { if ( parseInt( UA.version, 10 ) <= 9 ) { runTestsBoolean = false; } } //IE 8 & 9 have problems with the moment switching. Figure a way around this later, if possible. Otherwise, just //test manually by commenting this if statement out and refreshing over and over again. if ( runTestsBoolean ) { QUnit.module( "Fuel UX Datepicker with moment.js" ); QUnit.test( "should be defined on jquery object", function( assert ) { assert.ok( $().datepicker, "datepicker method is defined" ); } ); QUnit.test( "should return element", function( assert ) { var $datepicker = $( html ); assert.ok( $datepicker.datepicker() === $datepicker, "datepicker should be initialized" ); } ); QUnit.test( "should initialize with current date and restrict past dates by default", function( assert ) { var today = new Date(); var todaysDate = ( today.getDate() < 10 ) ? "0" + today.getDate() : today.getDate(); var todaysMonth = ( ( today.getMonth() + 1 ) < 10 ) ? "0" + ( today.getMonth() + 1 ) : ( today.getMonth() + 1 ); today = todaysMonth + "/" + todaysDate + "/" + today.getFullYear(); var $datepicker = $( html ).datepicker(); var pickerDate = $datepicker.datepicker( "getFormattedDate" ); assert.equal( pickerDate, today, "w/ markup - initialized with todays date" ); var pastRestrictionCheck = $datepicker.find( ".restricted" ).length > 0; assert.equal( pastRestrictionCheck, true, "restricted past dates are default" ); } ); QUnit.test( "should initialize with date other than now", function( assert ) { var $datepicker = $( html ); var futureDate = new Date( new Date().getTime() + 604800000 ).getTime(); // 7 days in the future var pickerDate; $datepicker.datepicker( { date: futureDate } ); pickerDate = $datepicker.datepicker( "getDate" ); assert.equal( pickerDate.getTime(), futureDate, "markup datepicker initialized with different date than now" ); } ); QUnit.test( "should handle 2 digit year", function( assert ) { var $datepicker = $( html ).datepicker(); var $datepickerInput = $datepicker.find( "input" ); var parsedAs; $datepickerInput.val( "01/01/68" ); $datepickerInput.trigger( "change" ); parsedAs = $datepicker.datepicker( "getFormattedDate" ); assert.equal( parsedAs, "01/01/2068", "01/01/68 parsed correctly" ); $datepickerInput.val( "1/1/68" ); $datepickerInput.trigger( "change" ); parsedAs = $datepicker.datepicker( "getFormattedDate" ); assert.equal( parsedAs, "01/01/2068", "1/1/68 parsed correctly" ); $datepickerInput.val( "1/1/69" ); $datepickerInput.trigger( "change" ); parsedAs = $datepicker.datepicker( "getFormattedDate" ); assert.equal( parsedAs, "01/01/1969", "1/1/69 parsed correctly" ); $datepickerInput.val( "01/01/69" ); $datepickerInput.trigger( "change" ); parsedAs = $datepicker.datepicker( "getFormattedDate" ); assert.equal( parsedAs, "01/01/1969", "01/01/69 parsed correctly" ); } ); QUnit.test( "should initialize with null date", function( assert ) { var $datepicker = $( html ).datepicker( { date: null } ); var initializedDate = $datepicker.datepicker( "getDate" ).toString(); var inputValue = $datepicker.find( 'input[type="text"]' ).val(); assert.equal( ( initializedDate === "Invalid Date" || initializedDate === "NaN" ), true, "datepicker was initialized with null value" ); assert.equal( inputValue, "", "datepicker does not have value in input field" ); } ); QUnit.test( "should return date using getDate method", function( assert ) { var $datepicker = $( html ).datepicker( { date: new Date( 1987, 2, 31 ) } ); var date = $datepicker.datepicker( "getDate" ); var dateFormatted = $datepicker.datepicker( "getFormattedDate" ); assert.equal( date instanceof Date, true, "returned a valid date object" ); assert.equal( ( date.getDate() === 31 && date.getMonth() === 2 && date.getFullYear() === 1987 ), true, "returned correct date" ); assert.equal( dateFormatted, "03/31/1987", "returned correct formatted date" ); } ); QUnit.test( "should return date using getValue alias", function( assert ) { var $datepicker = $( html ).datepicker( { date: new Date( 1987, 2, 31 ) } ); var date1 = $datepicker.datepicker( "getDate" ); var date2 = $datepicker.datepicker( "getValue" ); assert.equal( date1, date2, "getValue alias matches getDate" ); } ); QUnit.test( "should set new date using setDate method passing a Date object", function( assert ) { var $datepicker = $( html ).datepicker(); var newDate = new Date( 1987, 2, 31 ); var datepickerDate; $datepicker.datepicker( "setDate", newDate ); datepickerDate = $datepicker.datepicker( "getDate" ); assert.equal( datepickerDate.getTime(), newDate.getTime(), "setDate method works" ); } ); QUnit.test( "should set new date using setDate method passing a ISO string", function( assert ) { var $datepicker = $( html ).datepicker(); var dateString = '2015-05-29T04:00:00.000Z'; var newDate = new Date(dateString); var datepickerDate; $datepicker.datepicker( "setDate", dateString); datepickerDate = $datepicker.datepicker( "getDate" ); assert.equal( datepickerDate.getTime(), newDate.getTime(), "setDate method works" ); } ); QUnit.test( "should enable/disable datepicker", function( assert ) { var $datepicker = $( html ).datepicker(); var $datepickerInput = $datepicker.find( "input" ); var defaultState = !!$datepicker.find( "button" ).prop( "disabled" ) && !!$datepickerInput.prop( "disabled" ); assert.equal( defaultState, false, "datepicker is enabled" ); $datepicker.datepicker( "disable" ); var disabledState = !!$datepicker.find( "button" ).prop( "disabled" ) && !!$datepickerInput.prop( "disabled" ); assert.equal( disabledState, true, "datepicker is disabled" ); $datepicker.datepicker( "enable" ); var enabledState = !!$datepicker.find( "button" ).prop( "disabled" ) && !!$datepickerInput.prop( "disabled" ); assert.equal( enabledState, false, "datepicker is enabled again" ); } ); QUnit.test( "should not restrict past dates when allowPastDates option set to true", function( assert ) { var $datepicker = $( html ); var $pastDate; $datepicker.datepicker( { allowPastDates: true } ); $pastDate = $datepicker.find( ".past:first" ); assert.equal( $pastDate.hasClass( "restricted" ), false, "past dates are not restricted as expected" ); } ); QUnit.test( "should fire changed event when new date is input", function( assert ) { var called = 0; var $datepicker = $( html ).datepicker(); var $datepickerInput = $datepicker.find( "input" ); var date = new Date( NaN ); var event = false; $datepicker.on( "changed.fu.datepicker", function( e, dt ) { called++; date = dt; event = e; } ); $datepickerInput.val( "03/31/1987" ); $datepickerInput.trigger( "change" ); assert.equal( called, 1, "Event was triggered as expected" ); assert.equal( typeof event, "object", "Appropriate event object passed back as argument" ); assert.equal( ( date.getDate() === 31 && date.getMonth() === 2 && date.getFullYear() === 1987 ), true, "Appropriate date object passed back as argument" ); } ); QUnit.test( "should restrict navigation and selection of dates within other years if option sameYearOnly is set to true", function( assert ) { var $datepicker = $( html ).datepicker( { date: new Date( 1987, 2, 31 ), sameYearOnly: true } ); var $datepickerInput = $datepicker.find( "input" ); var $header = $datepicker.find( ".datepicker-calendar-header" ); var $titleButton = $header.find( ".title" ); var $titleYear = $titleButton.find( "span.year" ); var dateString; $datepicker.datepicker( "setDate", "12/01/1987" ); $header.find( ".next" ).trigger( "click" ); assert.equal( $titleYear.text(), "1987", "user can't next click outside current year" ); $datepicker.datepicker( "setDate", "01/01/1987" ); $header.find( ".prev" ).trigger( "click" ); assert.equal( $titleYear.text(), "1987", "user can't prev click outside current year" ); $titleButton.trigger( "click" ); assert.equal( $datepicker.find( ".datepicker-wheels-year" ).hasClass( "hidden" ), true, "years wheel hidden" ); $datepickerInput.val( "03/31/1988" ); $datepickerInput.trigger( "change" ); dateString = $datepicker.datepicker( "getDate" ).toString(); assert.equal( ( dateString === "Invalid Date" || dateString === "NaN" ), true, "user can\t input date outside current year" ); } ); QUnit.test( "should restrict days if restricted option is set", function( assert ) { var $datepicker = $( html ).datepicker( { allowPastDates: true, date: new Date( 1987, 2, 5 ), restricted: [ { from: new Date( 1987, 2, 1 ), to: new Date( 1987, 2, 4 ) }, { from: new Date( 1987, 2, 28 ), to: new Date( 1987, 3, 1 ) } ] } ); var dates = [ "1", "2", "3", "4", "28", "29", "30", "31", "1" ]; var i = 0; var month = "2"; $datepicker.find( ".restricted" ).each( function() { var $item = $( this ); if ( i > 7 ) { month = "3"; } assert.equal( ( $item.attr( "data-date" ) === dates[ i ] && $item.attr( "data-month" ) === month && $item.attr( "data-year" ) === "1987" ), true, "correct date restricted as expected" ); i++; } ); assert.equal( dates.length === i, true, "correct number of dates restricted" ); } ); QUnit.test( "should destroy control", function( assert ) { var $datepicker = $( html ).datepicker(); assert.equal( typeof( $datepicker.datepicker( "destroy" ) ), "string", "returns string (markup)" ); assert.equal( $datepicker.parent().length, false, "control has been removed from DOM" ); } ); //MOMENT TESTS QUnit.test( "should have moment.js doing the date parsing", function( assert ) { var $datepicker = $( html ).datepicker(); var momentBoolean = $datepicker.datepicker( "checkForMomentJS" ); var today = new Date(); var todaysDate = ( today.getDate() < 10 ) ? "0" + today.getDate() : today.getDate(); var todaysMonth = ( ( today.getMonth() + 1 ) < 10 ) ? "0" + ( today.getMonth() + 1 ) : ( today.getMonth() + 1 ); today = todaysMonth + "/" + todaysDate + "/" + today.getFullYear(); assert.equal( momentBoolean, true, "moment.js is being used" ); assert.equal( $datepicker.datepicker( "getFormattedDate" ), today, "moment.js parsed date correctly for default implementation (en culture)" ); } ); QUnit.test( "should not use moment if either formatCode or culture is missing", function( assert ) { var $datepicker1 = $( html ).datepicker( { momentConfig: { culture: null } } ); var result1 = $datepicker1.datepicker( "checkForMomentJS" ); var $datepicker2 = $( html ).datepicker( { momentConfig: { format: null } } ); var result2 = $datepicker2.datepicker( "checkForMomentJS" ); var $datepicker3 = $( html ).datepicker( { momentConfig: { culture: null, formatCode: null } } ); var result3 = $datepicker3.datepicker( "checkForMomentJS" ); var $datepicker4 = $( html ).datepicker( { momentConfig: { culture: "en", formatCode: "L" } } ); var result4 = $datepicker4.datepicker( "checkForMomentJS" ); var $datepicker5 = $( html ).datepicker( { momentConfig: { culture: "en", formatCode: "" } } ); var result5 = $datepicker5.datepicker( "checkForMomentJS" ); assert.equal( result1, false, "moment is not used because the option momentConfig.culture is null" ); assert.equal( result2, false, "moment is not used because the option momentConfig.format is null" ); assert.equal( result3, false, "moment is not used because the options momentConfig.culture and momentConfig.format are null" ); assert.equal( result4, true, "moment is used because both momentConfig options are set" ); assert.equal( result5, true, "moment is used because both momentConfig options are set, formatCode is empty" ); } ); QUnit.test( "should be initialized with different culture", function( assert ) { var culture = "de"; var $datepicker = $( html ).datepicker( { momentConfig: { culture: culture } } ); var today = new Date(); var todaysDate = ( today.getDate() < 10 ) ? "0" + today.getDate() : today.getDate(); var todaysMonth = ( ( today.getMonth() + 1 ) < 10 ) ? "0" + ( today.getMonth() + 1 ) : ( today.getMonth() + 1 ); today = todaysDate + "." + todaysMonth + "." + today.getFullYear(); assert.equal( $datepicker.datepicker( "getFormattedDate" ), today, "moment js parsed date correctly using different culture (de)" ); } ); QUnit.test( "should be initialized with different culture and different format", function( assert ) { var $datepicker = $( html ).datepicker( { momentConfig: { culture: "de", format: "l" } } ); var today = new Date(); today = today.getDate() + "." + ( today.getMonth() + 1 ) + "." + today.getFullYear(); assert.equal( $datepicker.datepicker( "getFormattedDate" ), today, "moment.js parsed date correctly for different culture and format (de, l)" ); } ); QUnit.test( "should get current culture", function( assert ) { var $datepicker = $( html ).datepicker(); assert.equal( $datepicker.datepicker( "getCulture" ), "en", "returned correct culture from initialization" ); $datepicker.datepicker( "setCulture", "de" ); assert.equal( $datepicker.datepicker( "getCulture" ), "de", "returned correct culture after being changed" ); } ); QUnit.test( "should set new culture", function( assert ) { var $datepicker = $( html ).datepicker(); var today = new Date(); var todaysDate = ( today.getDate() < 10 ) ? "0" + today.getDate() : today.getDate(); var todaysMonth = ( ( today.getMonth() + 1 ) < 10 ) ? "0" + ( today.getMonth() + 1 ) : ( today.getMonth() + 1 ); today = todaysDate + "." + todaysMonth + "." + today.getFullYear(); $datepicker.datepicker( "setCulture", "de" ); assert.equal( $datepicker.datepicker( "getCulture" ), "de", "returned correct culture after being changed" ); assert.equal( $datepicker.datepicker( "getFormattedDate" ), today, "did correct formatting after dynamic update" ); } ); QUnit.test( "should get format", function( assert ) { var $datepicker = $( html ).datepicker(); assert.equal( $datepicker.datepicker( "getFormat" ), "L", "returned correct format from initialization" ); $datepicker.datepicker( "setFormat", "l" ); assert.equal( $datepicker.datepicker( "getFormat" ), "l", "returned correct format after being changed" ); } ); QUnit.test( "should set new format", function( assert ) { var $datepicker = $( html ).datepicker(); var today = new Date(); today = ( today.getMonth() + 1 ) + "/" + today.getDate() + "/" + today.getFullYear(); $datepicker.datepicker( "setFormat", "l" ); assert.equal( $datepicker.datepicker( "getFormattedDate" ), today, "returned correct culture after being changed" ); } ); QUnit.test( "input parsing should take culture into account", function( assert ) { var $datepicker = $( html ).datepicker( { momentConfig: { culture: "fr", format: "L" } } ); var $datepickerInput = $datepicker.find( "input" ); var dateString = "30/10/2014"; var formatted; $datepickerInput.val( dateString ); $datepickerInput.trigger( "change" ); formatted = $datepicker.datepicker( "getFormattedDate" ); assert.equal( formatted, dateString, "moment.js formatted date should be equal to input" ); } ); QUnit.test( "when input is blurred, culture is german, and no date changes, input value should not change", function( assert ) { var date = "03.07.2014"; // July 3rd, 2014 var $datepicker = $( html ).datepicker( { allowPastDates: true, date: new Date( 2014, 6, 3 ), momentConfig: { culture: "de" } } ); var $input = $datepicker.find( "input" ); assert.equal( $datepicker.datepicker( "getFormattedDate" ), date, "moment.js parsed date correctly after initialization with de culture" ); $input.trigger( "blur" ); assert.equal( $datepicker.datepicker( "getFormattedDate" ), date, "moment.js parsed date correctly after input blurred" ); } ); QUnit.test( "when bad data is input, don't fail with bad date", function( assert ) { var date = "07/03/2014"; // July 3rd, 2014 var $datepicker = $( html ).datepicker( { allowPastDates: true, date: new Date( 2014, 6, 3 ) } ); var $input = $datepicker.find( "input" ); var dateString; assert.equal( $datepicker.datepicker( "getFormattedDate" ), date, "moment.js parsed date correctly after initialization with de culture" ); $input.val( "aa.bb.cccc" ); $input.trigger( "change" ); dateString = $datepicker.datepicker( "getDate" ).toString(); assert.equal( ( dateString === "Invalid Date" || dateString === "NaN" ), true, "datepicker should return 'Invalid Date' or 'NaN' when bad data is entered" ); } ); } } );