From b31dec98fc92df3592da069c0dac87470b4ed7b1 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Fri, 14 Feb 2025 18:08:42 +0100 Subject: [PATCH] Improve coverage of YearPicker & DatePicker. Fix some issues. --- .../js/tests/widgets/datetimepicker.js | 129 ++++++++++++++++++ .../static/creme_core/js/widgets/datetime.js | 18 ++- .../creme_core/tests/test_datefield.html | 68 +++++++++ 3 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 creme/creme_core/templates/creme_core/tests/test_datefield.html diff --git a/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js b/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js index 655e09bf02..6126e33af2 100644 --- a/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js +++ b/creme/creme_core/static/creme_core/js/tests/widgets/datetimepicker.js @@ -33,6 +33,23 @@ QUnit.module("creme.widgets.datetime.js", new QUnitMixin(QUnitAjaxMixin, value: options.value || '' }); + return html; + }, + + createDatePickerHtml: function(options) { + options = Object.assign({ + format: 'dd-mm-yy' + }, options || {}); + + var html = ( + '' + ).template({ + readonly: options.readonly ? 'readonly' : '', + disabled: options.disabled ? 'disabled' : '', + format: options.format, + value: options.value ? String(options.value) : '' + }); + return html; } })); @@ -143,4 +160,116 @@ QUnit.parametrize('creme.widget.DateTimePicker.val (from widget)', [ equal(element.find('.minute input').val(), expected.minute); }); +QUnit.parameterize('creme.widget.DatePicker.create (initial)', [ + [{format: 'dd-mm-yy', value: ''}, ''], + [{format: 'dd-mm-yy', value: '12-02-2025'}, '12-02-2025'], + [{format: 'dd/mm/yy', value: '12-02-2025'}, ''], + [{format: 'dd/mm/yy', value: '12/02/2025'}, '12/02/2025'] +], function(options, expected, assert) { + var element = $(this.createDatePickerHtml(options)).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + equal(element.hasClass('hasDatepicker'), true); // jquery datepicker is enabled + + equal(element.is('[disabled]'), false); + equal(element.is('[readonly]'), false); + + equal(expected, element.val()); + equal(expected, widget.val()); +}); + +QUnit.parameterize('creme.widget.DatePicker.create (disabled, readonly)', [ + [{value: '12-02-2025', disabled: true, readonly: false}], + [{value: '12-02-2025', disabled: false, readonly: true}], + [{value: '12-02-2025', disabled: true, readonly: true}] +], function(options, assert) { + var element = $(this.createDatePickerHtml(options)).appendTo(this.qunitFixture()); + creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + equal(element.hasClass('hasDatepicker'), true); // jquery datepicker is enabled + + equal(element.is('[disabled]'), options.disabled || options.readonly); + equal(element.is('[readonly]'), options.readonly); +}); + +QUnit.test('creme.widget.DatePicker.val (today)', function(assert) { + var element = $(this.createDatePickerHtml({ + value: '12-02-2024' + })).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + equal('12-02-2024', element.val()); + equal('12-02-2024', widget.val()); + + widget.val('13-03-2023'); + + equal('13-03-2023', element.val()); + equal('13-03-2023', widget.val()); + + equal(1, $('[name="today"]').length); + + $('[name="today"]').trigger('click'); + + var today = moment().format('DD-MM-YYYY'); + + equal(today, element.val()); + equal(today, widget.val()); +}); + +QUnit.parameterize('creme.widget.YearPicker.create', [ + [{value: '2025', disabled: false, readonly: false}], + [{value: '2025', disabled: true, readonly: false}], + [{value: '2025', disabled: false, readonly: true}], + [{value: '', disabled: false, readonly: false}] +], function(options, assert) { + options = options || {}; + + var element = $(( + '' + ).template({ + readonly: options.readonly ? 'readonly' : '', + disabled: options.disabled ? 'disabled' : '', + value: options.value ? String(options.value) : '' + })).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + equal(element.is('[disabled]'), options.disabled || false); + equal(element.is('[readonly]'), options.readonly || false); + + equal(options.value, element.val()); + equal(options.value, widget.val()); +}); + +QUnit.test('creme.widget.YearPicker.val (current year)', function(assert) { + var element = $( + '' + ).appendTo(this.qunitFixture()); + var widget = creme.widget.create(element); + + equal(element.hasClass('widget-active'), true); + equal(element.hasClass('widget-ready'), true); + + widget.val('2024'); + + equal('2024', element.val()); + equal('2024', widget.val()); + + equal(1, $('[name="current-year"]').length); + + $('[name="current-year"]').trigger('click'); + + equal(String(new Date().getFullYear()), element.val()); + equal(String(new Date().getFullYear()), widget.val()); +}); + }(jQuery)); diff --git a/creme/creme_core/static/creme_core/js/widgets/datetime.js b/creme/creme_core/static/creme_core/js/widgets/datetime.js index dd7bf1d38b..dc0a01ea7f 100644 --- a/creme/creme_core/static/creme_core/js/widgets/datetime.js +++ b/creme/creme_core/static/creme_core/js/widgets/datetime.js @@ -1,6 +1,6 @@ /******************************************************************************* Creme is a free/open-source Customer Relationship Management software - Copyright (C) 2009-2024 Hybird + Copyright (C) 2009-2025 Hybird This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by @@ -21,7 +21,6 @@ "use strict"; /* TODO: factorise? */ -/* TODO: unit test */ creme.widget.YearPicker = creme.widget.declare('ui-creme-yearpicker', { options: { readonly: false, @@ -74,7 +73,12 @@ creme.widget.YearPicker = creme.widget.declare('ui-creme-yearpicker', { }, val: function(element, value) { - return element.val(value); + if (value === undefined) { + return element.val(); + } + + element.val(value); + return this; } }); @@ -148,7 +152,12 @@ creme.widget.DatePicker = creme.widget.declare('ui-creme-datepicker', { }, val: function(element, value) { - return element.val(value); + if (value === undefined) { + return element.val(); + } + + element.val(value); + return this; } }); @@ -201,6 +210,7 @@ creme.widget.DateTimePicker = creme.widget.declare('ui-creme-datetimepicker', { } $('input[type="hidden"]', element).val(value).trigger('change'); + return this; } }); diff --git a/creme/creme_core/templates/creme_core/tests/test_datefield.html b/creme/creme_core/templates/creme_core/tests/test_datefield.html new file mode 100644 index 0000000000..6b681c4f1f --- /dev/null +++ b/creme/creme_core/templates/creme_core/tests/test_datefield.html @@ -0,0 +1,68 @@ +{% extends "creme_core/tests/testbase.html" %} + +{% block test_title %}Date fields{% endblock %} + +{% block test_header %} + +{% endblock %} + +{% block test_content %} +

creme.widget.YearPicker

+

+ + + +

+ +

creme.widget.DatePicker

+

+ + + + +

+ +

creme.widget.DateTimePicker

+

+ +

+ + + + + + +

+{% endblock %}