From 9f148224e7540d089e1d38a1d22be725ca5cfb27 Mon Sep 17 00:00:00 2001
From: Carlos Lizaga <carlos.lizaga@pronovias.com>
Date: Fri, 1 Dec 2017 17:24:28 +0100
Subject: [PATCH] Added form.test.js and removed JsTestDriver equivalent.
 Modified if documentation to be more friendly with developers.

---
 .../testsuite/mage/form/form-test.js          | 241 ----------------
 .../jasmine/tests/lib/mage/dropdown.test.js   |   9 +-
 .../js/jasmine/tests/lib/mage/form.test.js    | 262 ++++++++++++++++++
 3 files changed, 268 insertions(+), 244 deletions(-)
 delete mode 100644 dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js
 create mode 100644 dev/tests/js/jasmine/tests/lib/mage/form.test.js

diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js
deleted file mode 100644
index 83bdefd399e..00000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-FormTest = TestCase('FormTest');
-FormTest.prototype.setUp = function() {
-    /*:DOC += <form id="form" action="action/url" method="GET", target="_self" ></form>*/
-};
-FormTest.prototype.tearDown = function() {
-    var formInstance = jQuery('#form').data('form');
-    if(formInstance && formInstance.destroy) {
-        formInstance.destroy();
-    }
-};
-FormTest.prototype.testInit = function() {
-    var form = jQuery('#form').form();
-    assertTrue(form.is(':mage-form'));
-};
-FormTest.prototype.testRollback = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.prop('action'),
-            target: form.prop('target'),
-            method: form.prop('method')
-        };
-
-    form.data("form").oldAttributes = initialFormAttrs;
-    form.prop({
-        action: 'new/action/url',
-        target: '_blank',
-        method: 'POST'
-    });
-
-    assertNotEquals(form.prop('action'), initialFormAttrs.action);
-    assertNotEquals(form.prop('target'), initialFormAttrs.target);
-    assertNotEquals(form.prop('method'), initialFormAttrs.method);
-    form.data("form")._rollback();
-    assertEquals(form.prop('action'), initialFormAttrs.action);
-    assertEquals(form.prop('target'), initialFormAttrs.target);
-    assertEquals(form.prop('method'), initialFormAttrs.method);
-};
-FormTest.prototype.testGetHandlers = function() {
-    var form = jQuery('#form').form(),
-        handlersData = form.form('option', 'handlersData'),
-        handlers = [];
-    $.each(handlersData, function(key) {
-        handlers.push(key);
-    });
-    assertEquals(handlers.join(' '), form.data("form")._getHandlers().join(' '));
-};
-FormTest.prototype.testStoreAttribute = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.attr('action'),
-            target: form.attr('target'),
-            method: form.attr('method')
-        };
-    form.data("form")._storeAttribute('action');
-    form.data("form")._storeAttribute('target');
-    form.data("form")._storeAttribute('method');
-
-    assertEquals(form.data("form").oldAttributes.action, initialFormAttrs.action);
-    assertEquals(form.data("form").oldAttributes.target, initialFormAttrs.target);
-    assertEquals(form.data("form").oldAttributes.method, initialFormAttrs.method);
-};
-FormTest.prototype.testBind = function() {
-    var form = jQuery('#form').form(),
-        submitted = false,
-        handlersData = form.form('option', 'handlersData');
-
-    form.on('submit', function(e) {
-        submitted = true;
-        e.stopImmediatePropagation();
-        e.preventDefault();
-    });
-    $.each(handlersData, function(key) {
-        form.trigger(key);
-        assertTrue(submitted);
-        submitted = false;
-    });
-    form.off('submit');
-};
-FormTest.prototype.testGetActionUrl = function() {
-    var form = jQuery('#form').form(),
-        action = form.attr('action'),
-        testUrl = 'new/action/url',
-        testArgs = {
-            args: {arg: 'value'}
-        };
-
-    form.data("form")._storeAttribute('action');
-    assertEquals(form.data("form")._getActionUrl(testArgs), action + '/arg/value/');
-    assertEquals(form.data("form")._getActionUrl(testUrl), testUrl);
-    assertEquals(form.data("form")._getActionUrl(), action);
-};
-FormTest.prototype.testProcessData = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.attr('action'),
-            target: form.attr('target'),
-            method: form.attr('method')
-        },
-        testSimpleData = {
-            action: 'new/action/url',
-            target: '_blank',
-            method: 'POST'
-        },
-        testActionArgsData = {
-            action: {
-                args: {
-                    arg: 'value'
-                }
-            }
-        };
-    var processedData = form.data("form")._processData(testSimpleData);
-
-    assertEquals(form.data("form").oldAttributes.action, initialFormAttrs.action);
-    assertEquals(form.data("form").oldAttributes.target, initialFormAttrs.target);
-    assertEquals(form.data("form").oldAttributes.method, initialFormAttrs.method);
-
-    assertEquals(processedData.action, testSimpleData.action);
-    assertEquals(processedData.target, testSimpleData.target);
-    assertEquals(processedData.method, testSimpleData.method);
-
-    form.data("form")._rollback();
-
-    processedData = form.data("form")._processData(testActionArgsData);
-    form.data("form")._storeAttribute('action');
-    var newActionUrl = form.data("form")._getActionUrl(testActionArgsData.action);
-
-    assertEquals(processedData.action, newActionUrl);
-};
-FormTest.prototype.testBeforeSubmit = function() {
-    /*:DOC += <form id="test-form"></form> */
-    var testHandler = {
-            action: {
-                args: {
-                    arg1: 'value1'
-                }
-            }
-        },
-        form = jQuery('#form').form({handlersData: {
-                testHandler: testHandler
-            }
-        }),
-        beforeSubmitData = {
-            action: {
-                args: {
-                    arg2: 'value2'
-                }
-            },
-            target: '_blank'
-        },
-        eventData = {
-            method: 'POST'
-        },
-        resultData = $.extend(
-            true,
-            {},
-            testHandler,
-            beforeSubmitData,
-            eventData
-        );
-    form.data("form")._storeAttribute('action');
-
-    var testForm = jQuery('#test-form');
-    resultData = form.data("form")._processData(resultData);
-    testForm.prop(resultData);
-
-    form.on('beforeSubmit', function(e, data) {
-        jQuery.extend(data, beforeSubmitData);
-    });
-    form.on('submit', function(e) {
-        e.stopImmediatePropagation();
-        e.preventDefault();
-    });
-    form.data("form")._beforeSubmit('testHandler', eventData);
-
-    assertEquals(testForm.prop('action'), form.prop('action'));
-    assertEquals(testForm.prop('target'), form.prop('target'));
-    assertEquals(testForm.prop('method'), form.prop('method'));
-};
-FormTest.prototype.testSubmit = function() {
-    var form = jQuery('#form').form({
-            handlersData: {
-                save: {}
-            }
-        }),
-        formSubmitted = false;
-
-    form.data("form")._storeAttribute('action');
-    form.data("form")._storeAttribute('target');
-    form.data("form")._storeAttribute('method');
-    form
-        .on('submit', function(e) {
-            e.preventDefault();
-            e.stopImmediatePropagation();
-            e.preventDefault();
-            formSubmitted = true;
-        })
-        .prop({
-            action: 'new/action/url',
-            target: '_blank',
-            method: 'POST'
-        });
-
-    form.data("form")._submit({type: 'save'});
-
-    assertEquals(form.attr('action'), form.data("form").oldAttributes.action);
-    assertEquals(form.attr('target'), form.data("form").oldAttributes.target);
-    assertEquals(form.attr('method'), form.data("form").oldAttributes.method);
-    assertTrue(formSubmitted);
-    form.off('submit');
-};
-FormTest.prototype.testBuildURL = function() {
-    var dataProvider = [
-        {
-            params: ['http://domain.com//', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
-        },
-        {
-            params: ['http://domain.com', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
-        },
-        {
-            params: ['http://domain.com?some=param', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
-        },
-        {
-            params: ['http://domain.com?some=param&', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
-        }
-    ],
-        method = jQuery.mage.form._proto._buildURL,
-        quantity = dataProvider.length;
-
-    expectAsserts(quantity);
-    for (var i = 0; i < quantity; i++) {
-        assertEquals(dataProvider[i].expected, method.apply(null, dataProvider[i].params));
-    }
-};
diff --git a/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js b/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js
index 1034ad263d9..7279047adc5 100644
--- a/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js
+++ b/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js
@@ -270,9 +270,12 @@ define([
             jasmine.clock().uninstall();
         });
 
-        // Backend jquery-ui version has a diferent behavior on create that will add ui-dialog-titlebar anyway.
-        // This test is only valid with frontend's version
-        // @TODO: Re-design Jasmine settings to match a selective architecture for testing in order to split them.
+        /*
+         * jQuery ui version 1.9.2 belongs to the adminhtml.
+         *
+         * This test will fail on backend since backend's jquery.ui will
+         * add ui-dialog-titlebar class anyway on create.
+         */
         if ($.ui.version !== '1.9.2') {
             it('check if the title bar is prevented from being created', function () {
                 var dialog = $('<div/>'),
diff --git a/dev/tests/js/jasmine/tests/lib/mage/form.test.js b/dev/tests/js/jasmine/tests/lib/mage/form.test.js
new file mode 100644
index 00000000000..0f26516b481
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/form.test.js
@@ -0,0 +1,262 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* eslint-disable max-nested-callbacks */
+/* jscs:disable jsDoc */
+
+define([
+    'jquery',
+    'mage/backend/form'
+], function ($) {
+    'use strict';
+
+    /*
+     * jQuery ui version 1.9.2 belongs to the adminhtml.
+     *
+     * This test will fail on frontend since mage/backend/form only belongs to backend.
+     */
+    if ($.ui.version === '1.9.2') {
+        describe('Test for mage/form jQuery plugin', function () {
+            var id = 'edit_form',
+                elementId = '#' + id;
+
+            beforeEach(function () {
+                var element = jQuery('<form id="' + id + '" action="action/url" method="GET" target="_self" ></form>');
+
+                element.appendTo('body');
+            });
+
+            afterEach(function () {
+                $(elementId).remove();
+            });
+
+            it('check if form can be initialized', function () {
+                var form = $(elementId).form();
+
+                expect(form.is(':mage-form')).toBeTruthy();
+            });
+
+            it('check get handlers', function () {
+                var form = $(elementId).form(),
+                    handlersData = form.form('option', 'handlersData'),
+                    handlers = [];
+
+                $.each(handlersData, function (key) {
+                    handlers.push(key);
+                });
+                expect(handlers.join(' ')).toBe(form.data('form')._getHandlers().join(' '));
+            });
+
+            it('check store attribute', function () {
+                var form = $(elementId).form(),
+                    initialFormAttrs = {
+                        action: form.attr('action'),
+                        target: form.attr('target'),
+                        method: form.attr('method')
+                    };
+
+                form.data('form')._storeAttribute('action');
+                form.data('form')._storeAttribute('target');
+                form.data('form')._storeAttribute('method');
+
+                expect(form.data('form').oldAttributes.action).toBe(initialFormAttrs.action);
+                expect(form.data('form').oldAttributes.target).toBe(initialFormAttrs.target);
+                expect(form.data('form').oldAttributes.method).toBe(initialFormAttrs.method);
+            });
+
+            it('check bind', function () {
+                var form = $(elementId).form(),
+                    submitted = false,
+                    handlersData = form.form('option', 'handlersData');
+
+                form.on('submit', function (e) {
+                    submitted = true;
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                });
+
+                $.each(handlersData, function (key) {
+                    form.trigger(key);
+                    expect(submitted).toBeTruthy();
+                    submitted = false;
+                });
+
+                form.off('submit');
+            });
+
+            it('check get action URL', function () {
+                var form = $(elementId).form(),
+                    action = form.attr('action'),
+                    testUrl = 'new/action/url',
+                    testArgs = {
+                        args: {
+                            arg: 'value'
+                        }
+                    };
+
+                form.data('form')._storeAttribute('action');
+                expect(form.data('form')._getActionUrl(testArgs)).toBe(action + '/arg/value/');
+                expect(form.data('form')._getActionUrl(testUrl)).toBe(testUrl);
+                expect(form.data('form')._getActionUrl()).toBe(action);
+            });
+
+            it('check process data', function () {
+                var form = $(elementId).form(),
+                    initialFormAttrs = {
+                        action: form.attr('action'),
+                        target: form.attr('target'),
+                        method: form.attr('method')
+                    },
+                    testSimpleData = {
+                        action: 'new/action/url',
+                        target: '_blank',
+                        method: 'POST'
+                    },
+                    testActionArgsData = {
+                        action: {
+                            args: {
+                                arg: 'value'
+                            }
+                        }
+                    },
+                    processedData = form.data('form')._processData(testSimpleData);
+
+                expect(form.data('form').oldAttributes.action).toBe(initialFormAttrs.action);
+                expect(form.data('form').oldAttributes.target).toBe(initialFormAttrs.target);
+                expect(form.data('form').oldAttributes.method).toBe(initialFormAttrs.method);
+                expect(processedData.action).toBe(testSimpleData.action);
+                expect(processedData.target).toBe(testSimpleData.target);
+                expect(processedData.method).toBe(testSimpleData.method);
+
+                form.data('form')._rollback();
+                processedData = form.data('form')._processData(testActionArgsData);
+                form.data('form')._storeAttribute('action');
+                expect(processedData.action).toBe(form.data('form')._getActionUrl(testActionArgsData.action));
+            });
+
+            it('check before submit', function () {
+                var testForm = $('<form id="test-form"></form>').appendTo('body'),
+                    testHandler = {
+                        action: {
+                            args: {
+                                arg1: 'value1'
+                            }
+                        }
+                    },
+                    form = $(elementId).form({
+                        handlersData: {
+                            testHandler: testHandler
+                        }
+                    }),
+                    beforeSubmitData = {
+                        action: {
+                            args: {
+                                arg2: 'value2'
+                            }
+                        },
+                        target: '_blank'
+                    },
+                    eventData = {
+                        method: 'POST'
+                    },
+                    resultData = $.extend(true, {}, testHandler, beforeSubmitData, eventData);
+
+                form.data('form')._storeAttribute('action');
+                resultData = form.data('form')._processData(resultData);
+                testForm.prop(resultData);
+
+                form.on('beforeSubmit', function (e, data) {
+                    $.extend(data, beforeSubmitData);
+                });
+
+                form.on('submit', function (e) {
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                });
+
+                form.data('form')._beforeSubmit('testHandler', eventData);
+                expect(testForm.prop('action')).toBe(form.prop('action'));
+                expect(testForm.prop('target')).toBe(form.prop('target'));
+                expect(testForm.prop('method')).toBe(form.prop('method'));
+            });
+
+            it('check submit', function () {
+                var formSubmitted = false,
+                    form = $(elementId).form({
+                        handlersData: {
+                            save: {}
+                        }
+                    });
+
+                form.data('form')._storeAttribute('action');
+                form.data('form')._storeAttribute('target');
+                form.data('form')._storeAttribute('method');
+
+                form.on('submit', function (e) {
+                    e.preventDefault();
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                    formSubmitted = true;
+                }).prop({
+                    action: 'new/action/url',
+                    target: '_blank',
+                    method: 'POST'
+                });
+
+                form.data('form')._submit({
+                    type: 'save'
+                });
+
+                expect(form.attr('action')).toBe(form.data('form').oldAttributes.action);
+                expect(form.attr('target')).toBe(form.data('form').oldAttributes.target);
+                expect(form.attr('method')).toBe(form.data('form').oldAttributes.method);
+                expect(formSubmitted).toBeTruthy();
+
+                form.off('submit');
+            });
+
+            it('check build URL', function () {
+                var dataProvider = [
+                        {
+                            params: ['http://domain.com//', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
+                        },
+                        {
+                            params: ['http://domain.com', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
+                        },
+                        {
+                            params: ['http://domain.com?some=param', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
+                        },
+                        {
+                            params: ['http://domain.com?some=param&', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
+                        }
+                    ],
+                    method = $.mage.form._proto._buildURL,
+                    quantity = dataProvider.length,
+                    i = 0;
+
+                expect(quantity).toBeTruthy();
+
+                for (i; i < quantity; i++) {
+                    expect(dataProvider[i].expected).toBe(method.apply(null, dataProvider[i].params));
+                }
+            });
+        });
+    }
+});
-- 
GitLab