diff --git a/web/karma.conf.js b/web/karma.conf.js index 2bc67573..0abab70f 100644 --- a/web/karma.conf.js +++ b/web/karma.conf.js @@ -21,7 +21,7 @@ module.exports = function (config) { // list of files to exclude exclude: [ 'pgadmin/static/vendor/**/*[Tt]est.js', - 'pgadmin/static/vendor/**/*[Ss]pec.js' + 'pgadmin/static/vendor/**/*[Ss]pec.js', ], // preprocess matching files before serving them to the browser @@ -61,6 +61,6 @@ module.exports = function (config) { // Concurrency level // how many browser should be started simultaneous - concurrency: Infinity + concurrency: Infinity, }); }; diff --git a/web/package.json b/web/package.json index 40070da0..b5d2e0cb 100644 --- a/web/package.json +++ b/web/package.json @@ -5,6 +5,8 @@ "babel-preset-es2015": "~6.24.0", "babel-preset-react": "~6.23.0", "enzyme": "~2.8.2", + "eslint": "^3.19.0", + "eslint-plugin-react": "^6.10.3", "jasmine-core": "~2.5.2", "karma": "~1.5.0", "karma-babel-preprocessor": "^6.0.1", @@ -34,9 +36,11 @@ "watchify": "~3.9.0" }, "scripts": { - "bundle": "yarn run webpack -- --optimize-minimize --config webpack.config.js", - "test:karma-once": "yarn run karma start -- --single-run", - "test:karma": "yarn run karma start", + "linter": "yarn run eslint pgadmin/static/jsx/**/*.jsx pgadmin/static/js/selection/*.js regression/javascript/**/*.jsx regression/javascript/**/*.js *.js", + "webpacker": "yarn run webpack -- --optimize-minimize --config webpack.config.js", + "bundle": "yarn run linter && yarn run webpacker", + "test:karma-once": "yarn run linter && yarn run karma start -- --single-run", + "test:karma": "yarn run linter && yarn run karma start", "test:feature": "yarn run bundle && python regression/runtests.py --pkg feature_tests", "test": "yarn run test:karma-once && yarn run bundle && python regression/runtests.py" } diff --git a/web/pgadmin/static/js/selection/clipboard.js b/web/pgadmin/static/js/selection/clipboard.js index 9e20da7e..9794ae7e 100644 --- a/web/pgadmin/static/js/selection/clipboard.js +++ b/web/pgadmin/static/js/selection/clipboard.js @@ -1,7 +1,7 @@ define(['sources/gettext', 'alertify'], function (gettext, alertify) { var clipboard = { copyTextToClipboard: function (text) { - var textArea = document.createElement("textarea"); + var textArea = document.createElement('textarea'); // // *** This styling is an extra step which is likely not required. *** @@ -55,7 +55,7 @@ define(['sources/gettext', 'alertify'], function (gettext, alertify) { } document.body.removeChild(textArea); - } + }, }; return clipboard; }); \ No newline at end of file diff --git a/web/pgadmin/static/js/selection/column_selector.js b/web/pgadmin/static/js/selection/column_selector.js index c89b3fa8..a81b6918 100644 --- a/web/pgadmin/static/js/selection/column_selector.js +++ b/web/pgadmin/static/js/selection/column_selector.js @@ -2,18 +2,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func var ColumnSelector = function () { var init = function (grid) { grid.onHeaderClick.subscribe(function (event, eventArgument) { - var column = eventArgument.column; + var column = eventArgument.column; - if (column.selectable !== false) { + if (column.selectable !== false) { - if (!clickedCheckbox(event)) { - var $checkbox = $("[data-id='checkbox-" + column.id + "']"); - toggleCheckbox($checkbox); - } - - updateRanges(grid, column.id); + if (!clickedCheckbox(event)) { + var $checkbox = $('[data-id=\'checkbox-' + column.id + '\']'); + toggleCheckbox($checkbox); } + + updateRanges(grid, column.id); } + } ); grid.getSelectionModel().onSelectedRangesChanged .subscribe(handleSelectedRangesChanged.bind(null, grid)); @@ -52,14 +52,14 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func }; var clickedCheckbox = function (e) { - return e.target.type == "checkbox" + return e.target.type == 'checkbox'; }; var toggleCheckbox = function (checkbox) { - if (checkbox.prop("checked")) { - checkbox.prop("checked", false) + if (checkbox.prop('checked')) { + checkbox.prop('checked', false); } else { - checkbox.prop("checked", true) + checkbox.prop('checked', true); } }; @@ -67,15 +67,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func return _.map(columnDefinitions, function (columnDefinition) { if (columnDefinition.selectable !== false) { var name = - "" + - " " + - " " + columnDefinition.name + "" + - ""; + '' + + ' ' + + ' ' + columnDefinition.name + '' + + ''; return _.extend(columnDefinition, { - name: name + name: name, }); } else { return columnDefinition; @@ -84,8 +84,8 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func }; $.extend(this, { - "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + 'init': init, + 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes, }); }; return ColumnSelector; diff --git a/web/pgadmin/static/js/selection/copy_data.js b/web/pgadmin/static/js/selection/copy_data.js index 018efead..0ccd4b96 100644 --- a/web/pgadmin/static/js/selection/copy_data.js +++ b/web/pgadmin/static/js/selection/copy_data.js @@ -5,48 +5,48 @@ define([ 'sources/selection/range_selection_helper', 'sources/selection/range_boundary_navigator'], function ($, _, clipboard, RangeSelectionHelper, rangeBoundaryNavigator) { - var copyData = function () { - var self = this; - - var grid = self.slickgrid; - var columnDefinitions = grid.getColumns(); - var selectedRanges = grid.getSelectionModel().getSelectedRanges(); - var data = grid.getData(); - var rows = grid.getSelectedRows(); + var copyData = function () { + var self = this; + + var grid = self.slickgrid; + var columnDefinitions = grid.getColumns(); + var selectedRanges = grid.getSelectionModel().getSelectedRanges(); + var data = grid.getData(); + var rows = grid.getSelectedRows(); + + + if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) { + self.copied_rows = rows.map(function (rowIndex) { + return data[rowIndex]; + }); + setPasteRowButtonEnablement(self.can_edit, true); + } else { + self.copied_rows = []; + setPasteRowButtonEnablement(self.can_edit, false); + } + + var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges); + if (csvText) { + clipboard.copyTextToClipboard(csvText); + } + }; + + var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) { + if (canEditFlag) { + $('#btn-paste-row').prop('disabled', !isEnabled); + } + }; + + var allTheRangesAreFullRows = function (ranges, columnDefinitions) { + var colRangeBounds = ranges.map(function (range) { + return [range.fromCell, range.toCell]; + }); + if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) { + return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]); + } + return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]); + }; - if (allTheRangesAreFullRows(selectedRanges, columnDefinitions)) { - self.copied_rows = rows.map(function (rowIndex) { - return data[rowIndex]; - }); - setPasteRowButtonEnablement(self.can_edit, true); - } else { - self.copied_rows = []; - setPasteRowButtonEnablement(self.can_edit, false); - } - - var csvText = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, selectedRanges); - if (csvText) { - clipboard.copyTextToClipboard(csvText); - } - }; - - var setPasteRowButtonEnablement = function (canEditFlag, isEnabled) { - if (canEditFlag) { - $("#btn-paste-row").prop('disabled', !isEnabled); - } - }; - - var allTheRangesAreFullRows = function (ranges, columnDefinitions) { - var colRangeBounds = ranges.map(function (range) { - return [range.fromCell, range.toCell]; - }); - - if(RangeSelectionHelper.isFirstColumnData(columnDefinitions)) { - return _.isEqual(_.union.apply(null, colRangeBounds), [0, columnDefinitions.length - 1]); - } - return _.isEqual(_.union.apply(null, colRangeBounds), [1, columnDefinitions.length - 1]); - }; - - return copyData; -}); + return copyData; + }); diff --git a/web/pgadmin/static/js/selection/grid_selector.js b/web/pgadmin/static/js/selection/grid_selector.js index 31aee69f..6317f44e 100644 --- a/web/pgadmin/static/js/selection/grid_selector.js +++ b/web/pgadmin/static/js/selection/grid_selector.js @@ -31,7 +31,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se }; function handleSelectedRangesChanged(grid) { - $("[data-id='checkbox-select-all']").prop("checked", isEntireGridSelected(grid)); + $('[data-id=\'checkbox-select-all\']').prop('checked', isEntireGridSelected(grid)); } function isEntireGridSelected(grid) { @@ -44,7 +44,7 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se if (isEntireGridSelected(grid)) { deselect(grid); } else { - selectAll(grid) + selectAll(grid); } } @@ -70,8 +70,8 @@ define(['jquery', 'sources/selection/column_selector', 'sources/selection/row_se } $.extend(this, { - "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + 'init': init, + 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes, }); }; diff --git a/web/pgadmin/static/js/selection/range_boundary_navigator.js b/web/pgadmin/static/js/selection/range_boundary_navigator.js index a268d245..f69540b9 100644 --- a/web/pgadmin/static/js/selection/range_boundary_navigator.js +++ b/web/pgadmin/static/js/selection/range_boundary_navigator.js @@ -99,13 +99,13 @@ define(['sources/selection/range_selection_helper'], function (RangeSelectionHel var val = data[rowId][columnDefinitions[colId].pos]; if (val && _.isObject(val)) { - val = "'" + JSON.stringify(val) + "'"; - } else if (val && typeof val != "number" && typeof val != "boolean") { - val = "'" + val.toString() + "'"; + val = '\'' + JSON.stringify(val) + '\''; + } else if (val && typeof val != 'number' && typeof val != 'boolean') { + val = '\'' + val.toString() + '\''; } else if (_.isNull(val) || _.isUndefined(val)) { val = ''; } return val; - } + }, }; }); \ No newline at end of file diff --git a/web/pgadmin/static/js/selection/range_selection_helper.js b/web/pgadmin/static/js/selection/range_selection_helper.js index 31ad3bf7..4bd55975 100644 --- a/web/pgadmin/static/js/selection/range_selection_helper.js +++ b/web/pgadmin/static/js/selection/range_selection_helper.js @@ -8,14 +8,14 @@ define(['slickgrid'], function () { var isRangeSelected = function (selectedRanges, range) { return _.any(selectedRanges, function (selectedRange) { - return isSameRange(selectedRange, range) - }) + return isSameRange(selectedRange, range); + }); }; var removeRange = function (selectedRanges, range) { return _.filter(selectedRanges, function (selectedRange) { - return !(isSameRange(selectedRange, range)) - }) + return !(isSameRange(selectedRange, range)); + }); }; var addRange = function (ranges, range) { @@ -26,15 +26,15 @@ define(['slickgrid'], function () { var areAllRangesRows = function (ranges, grid) { return _.every(ranges, function (range) { return range.fromRow == range.toRow && - range.fromCell == 1 && range.toCell == grid.getColumns().length - 1 - }) + range.fromCell == 1 && range.toCell == grid.getColumns().length - 1; + }); }; var areAllRangesColumns = function (ranges, grid) { return _.every(ranges, function (range) { return range.fromCell == range.toCell && - range.fromRow == 0 && range.toRow == grid.getDataLength() - 1 - }) + range.fromRow == 0 && range.toRow == grid.getDataLength() - 1; + }); }; var rangeForRow = function (grid, rowId) { @@ -46,8 +46,8 @@ define(['slickgrid'], function () { }; function rangeForColumn(grid, columnIndex) { - return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex) - }; + return new Slick.Range(0, columnIndex, grid.getDataLength() - 1, columnIndex); + } var getRangeOfWholeGrid = function (grid) { return new Slick.Range(0, 1, grid.getDataLength() - 1, grid.getColumns().length - 1); @@ -73,6 +73,6 @@ define(['slickgrid'], function () { rangeForColumn: rangeForColumn, isEntireGridSelected: isEntireGridSelected, getRangeOfWholeGrid: getRangeOfWholeGrid, - isFirstColumnData: isFirstColumnData - } + isFirstColumnData: isFirstColumnData, + }; }); \ No newline at end of file diff --git a/web/pgadmin/static/js/selection/row_selector.js b/web/pgadmin/static/js/selection/row_selector.js index 76a8c1a7..583f8a75 100644 --- a/web/pgadmin/static/js/selection/row_selector.js +++ b/web/pgadmin/static/js/selection/row_selector.js @@ -8,18 +8,18 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func grid.getSelectionModel() .onSelectedRangesChanged.subscribe(handleSelectedRangesChanged.bind(null, grid)); gridEventBus - .subscribe(grid.onClick, handleClick.bind(null, grid)) + .subscribe(grid.onClick, handleClick.bind(null, grid)); }; var handleClick = function (grid, event, args) { if (grid.getColumns()[args.cell].id === 'row-header-column') { - if (event.target.type != "checkbox") { + if (event.target.type != 'checkbox') { var checkbox = $(event.target).find('input[type="checkbox"]'); toggleCheckbox($(checkbox)); } updateRanges(grid, args.row); } - } + }; var handleSelectedRangesChanged = function (grid, event, ranges) { $('[data-cell-type="row-header-checkbox"]:checked') @@ -32,7 +32,7 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func toggleCheckbox($checkbox); } }); - } + }; var updateRanges = function (grid, rowId) { var selectionModel = grid.getSelectionModel(); @@ -51,13 +51,13 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func } } selectionModel.setSelectedRanges(newRanges); - } + }; var toggleCheckbox = function (checkbox) { - if (checkbox.prop("checked")) { - checkbox.prop("checked", false) + if (checkbox.prop('checked')) { + checkbox.prop('checked', false); } else { - checkbox.prop("checked", true) + checkbox.prop('checked', true); } }; @@ -70,15 +70,15 @@ define(['jquery', 'sources/selection/range_selection_helper', 'slickgrid'], func formatter: function (rowIndex) { return '' - } + 'data-cell-type="row-header-checkbox"/>'; + }, }); return columnDefinitions; }; $.extend(this, { - "init": init, - "getColumnDefinitionsWithCheckboxes": getColumnDefinitionsWithCheckboxes + 'init': init, + 'getColumnDefinitionsWithCheckboxes': getColumnDefinitionsWithCheckboxes, }); }; return RowSelector; diff --git a/web/pgadmin/static/js/selection/set_staged_rows.js b/web/pgadmin/static/js/selection/set_staged_rows.js index cace7282..55732e41 100644 --- a/web/pgadmin/static/js/selection/set_staged_rows.js +++ b/web/pgadmin/static/js/selection/set_staged_rows.js @@ -10,7 +10,7 @@ define( [ 'jquery', - 'underscore' + 'underscore', ], function ($, _) { function disableButton(selector) { @@ -54,7 +54,7 @@ define( _.each(_.keys(gridRow), function (columnPos) { if (_.contains(primaryKeyColumnIndices, Number(columnPos))) rowToStage[columnPos] = gridRow[columnPos]; - }) + }); } return rowToStage; } @@ -71,7 +71,7 @@ define( return stagedRows; } - var setStagedRows = function (e, args) { + var setStagedRows = function () { var self = this; function setStagedRows(rowsToStage) { diff --git a/web/regression/javascript/browser/menu_spec.js b/web/regression/javascript/browser/menu_spec.js index 09f136fb..8def5a0d 100644 --- a/web/regression/javascript/browser/menu_spec.js +++ b/web/regression/javascript/browser/menu_spec.js @@ -7,13 +7,15 @@ // ////////////////////////////////////////////////////////////// -define(["browser/menu" -], function () { - describe("MenuItem", function () { +define([ + 'pgadmin', + 'browser/menu', +], function (pgAdmin) { + describe('MenuItem', function () { var MenuItem = pgAdmin.Browser.MenuItem; var menuItem; - describe("when we create a menu item", function () { + describe('when we create a menu item', function () { describe('and it is disabled', function () { beforeEach(function () { menuItem = new MenuItem({enable: false, icon: 'fa fa-car'}); diff --git a/web/regression/javascript/fake_translations.js b/web/regression/javascript/fake_translations.js index 9516fd63..a3d4f5bd 100644 --- a/web/regression/javascript/fake_translations.js +++ b/web/regression/javascript/fake_translations.js @@ -8,5 +8,5 @@ ////////////////////////////////////////////////////////////////////////// define(function () { - return {} + return {}; }); \ No newline at end of file diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js index 2ce98a23..54fc498d 100644 --- a/web/regression/javascript/gettext_spec.js +++ b/web/regression/javascript/gettext_spec.js @@ -7,45 +7,46 @@ // ////////////////////////////////////////////////////////////////////////// -define(["sources/gettext", "translations"], function (gettext, translations) { - describe("translate", function () { - describe("when there is no translation", function () { - it("returns the original string", function () { - expect(gettext("something to be translated")).toEqual("something to be translated"); - }); - - describe("when there are substitutions", function () { - it("interpolates a substitution", function () { - expect(gettext("translate text for %(person)s", {"person": "Sarah"})).toEqual("translate text for Sarah") - }); - - it("interpolates multiple substitutions", function () { - expect(gettext("translate '%(text)s' for %(person)s", - { - "text": "constitution", - "person": "Sarah" - } - )).toEqual("translate 'constitution' for Sarah") - }); - }); +import gettext from 'sources/gettext'; +import translations from 'translations'; +describe('translate', function () { + describe('when there is no translation', function () { + it('returns the original string', function () { + expect(gettext('something to be translated')).toEqual('something to be translated'); }); - describe("when there is a translation", function () { - beforeEach(function () { - translations['something to be translated'] = 'etwas zum uebersetzen'; - translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s'; + describe('when there are substitutions', function () { + it('interpolates a substitution', function () { + expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah'); }); - it("returns the translation", function () { - expect(gettext("something to be translated")).toEqual("etwas zum uebersetzen"); + it('interpolates multiple substitutions', function () { + expect(gettext('translate \'%(text)s\' for %(person)s', + { + 'text': 'constitution', + 'person': 'Sarah', + } + )).toEqual('translate \'constitution\' for Sarah'); }); + }); + + }); + + describe('when there is a translation', function () { + beforeEach(function () { + translations['something to be translated'] = 'etwas zum uebersetzen'; + translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s'; + }); + + it('returns the translation', function () { + expect(gettext('something to be translated')).toEqual('etwas zum uebersetzen'); + }); - describe("when there is a substitution", function () { - it("interpolates the substitution", function () { - expect(gettext("another translation for %(person)s", {"person": "Sarah"})) - .toEqual("eine weitere Uebersetzung fuer Sarah"); - }); + describe('when there is a substitution', function () { + it('interpolates the substitution', function () { + expect(gettext('another translation for %(person)s', {'person': 'Sarah'})) + .toEqual('eine weitere Uebersetzung fuer Sarah'); }); }); }); diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js index 947f4852..2cba0af5 100644 --- a/web/regression/javascript/selection/column_selector_spec.js +++ b/web/regression/javascript/selection/column_selector_spec.js @@ -1,235 +1,243 @@ -define( - ["jquery", - "underscore", - "slickgrid/slick.grid", - "sources/selection/column_selector", - "slickgrid/slick.rowselectionmodel", - "slickgrid" - ], - function ($, _, SlickGrid, ColumnSelector, RowSelectionModel, Slick) { - describe("ColumnSelector", function () { - var container, data, columns, options; +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2017, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////////////////// + +import $ from 'jquery'; + +import Slick from 'slickgrid'; +import 'slickgrid.grid'; + +import RowSelectionModel from '../../../pgadmin/static/vendor/slickgrid/plugins/slick.rowselectionmodel'; +import ColumnSelector from '../../../pgadmin/static/js/selection/column_selector'; + + +describe('ColumnSelector', function () { + var container, data, columns, options; + beforeEach(function () { + container = $('
'); + container.height(9999); + + data = [{'some-column-name': 'first value', 'second column': 'second value'}]; + + columns = [ + { + id: '1', + name: 'some-column-name', + }, + { + id: '2', + name: 'second column', + }, + { + name: 'some-non-selectable-column', + selectable: false, + }, + ]; + }); + + describe('when a column is not selectable', function () { + it('does not create a checkbox for selecting the column', function () { + var checkboxColumn = { + name: 'some-column-name-4', + selectable: false, + }; + columns.push(checkboxColumn); + + setupGrid(columns); + + expect(container.find('.slick-header-columns input').length).toBe(2); + }); + }); + + it('renders a checkbox in the column header', function () { + setupGrid(columns); + + expect(container.find('.slick-header-columns input').length).toBe(2); + }); + + it('displays the name of the column', function () { + setupGrid(columns); + + expect($(container.find('.slick-header-columns .slick-column-name')[0]).text()) + .toContain('some-column-name'); + expect($(container.find('.slick-header-columns .slick-column-name')[1]).text()) + .toContain('second column'); + }); + + it('preserves the other attributes of column definitions', function () { + var columnSelector = new ColumnSelector(); + var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + + expect(selectableColumns[0].id).toBe('1'); + }); + + describe('selecting columns', function () { + var grid, rowSelectionModel; + beforeEach(function () { + var columnSelector = new ColumnSelector(); + columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + data = []; + for (var i = 0; i < 10; i++) { + data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i}); + } + grid = new Slick.Grid(container, data, columns, options); + + rowSelectionModel = new RowSelectionModel(); + grid.setSelectionModel(rowSelectionModel); + + grid.registerPlugin(columnSelector); + grid.invalidate(); + $('body').append(container); + }); + + afterEach(function () { + $('body').find(container).remove(); + }); + + describe('when the user clicks a column header', function () { + it('selects the column', function () { + container.find('.slick-header-column')[0].click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expectOnlyTheFirstColumnToBeSelected(selectedRanges); + }); + }); + + describe('when the user clicks additional column headers', function () { + beforeEach(function () { + container.find('.slick-header-column')[1].click(); + }); + + it('selects additional columns', function () { + container.find('.slick-header-column')[0].click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + var column1 = selectedRanges[0]; + + expect(selectedRanges.length).toEqual(2); + expect(column1.fromCell).toBe(1); + expect(column1.toCell).toBe(1); + + var column2 = selectedRanges[1]; + + expect(column2.fromCell).toBe(0); + expect(column2.toCell).toBe(0); + }); + }); + + describe('when the user clicks a column header checkbox', function () { + it('selects the column', function () { + container.find('.slick-header-columns input')[0].click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expectOnlyTheFirstColumnToBeSelected(selectedRanges); + }); + + it('checks the checkbox', function () { + container.find('.slick-header-column')[1].click(); + expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy(); + }); + }); + + describe('when a row is selected', function () { beforeEach(function () { - container = $("
"); - container.height(9999); - - data = [{'some-column-name': 'first value', 'second column': 'second value'}]; - - columns = [ - { - id: '1', - name: 'some-column-name', - }, - { - id: '2', - name: 'second column', - }, - { - name: 'some-non-selectable-column', - selectable: false - } - ] + var selectedRanges = [new Slick.Range(0, 0, 0, 1)]; + rowSelectionModel.setSelectedRanges(selectedRanges); }); - describe("when a column is not selectable", function () { - it("does not create a checkbox for selecting the column", function () { - var checkboxColumn = { - name: 'some-column-name-4', - selectable: false - }; - columns.push(checkboxColumn); + it('deselects the row', function () { + container.find('.slick-header-column')[1].click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); - setupGrid(columns); + expect(selectedRanges.length).toBe(1); - expect(container.find('.slick-header-columns input').length).toBe(2) - }); + var column = selectedRanges[0]; + + expect(column.fromCell).toBe(1); + expect(column.toCell).toBe(1); + expect(column.fromRow).toBe(0); + expect(column.toRow).toBe(9); }); + }); - it("renders a checkbox in the column header", function () { - setupGrid(columns); + describe('clicking a second time', function () { + beforeEach(function () { + container.find('.slick-header-column')[1].click(); + }); - expect(container.find('.slick-header-columns input').length).toBe(2) + it('unchecks checkbox', function () { + container.find('.slick-header-column')[1].click(); + expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); }); - it("displays the name of the column", function () { - setupGrid(columns); + it('deselects the column', function () { + container.find('.slick-header-column')[1].click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect($(container.find('.slick-header-columns .slick-column-name')[0]).text()) - .toContain('some-column-name'); - expect($(container.find('.slick-header-columns .slick-column-name')[1]).text()) - .toContain('second column'); + expect(selectedRanges.length).toEqual(0); }); + }); - it("preserves the other attributes of column definitions", function () { - var columnSelector = new ColumnSelector(); - var selectableColumns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + describe('when the column is not selectable', function () { + it('does not select the column', function () { + $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect(selectableColumns[0].id).toBe('1'); + expect(selectedRanges.length).toEqual(0); }); + }); - describe("selecting columns", function () { - var grid, rowSelectionModel; - beforeEach(function () { - var columnSelector = new ColumnSelector(); - columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); - data = []; - for (var i = 0; i < 10; i++) { - data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i}); - } - grid = new SlickGrid(container, data, columns, options); - - rowSelectionModel = new RowSelectionModel(); - grid.setSelectionModel(rowSelectionModel); - - grid.registerPlugin(columnSelector); - grid.invalidate(); - $("body").append(container); - }); - - afterEach(function () { - $("body").find(container).remove(); - }); - - describe("when the user clicks a column header", function () { - it("selects the column", function () { - container.find('.slick-header-column')[0].click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expectOnlyTheFirstColumnToBeSelected(selectedRanges); - }); - }); - - describe("when the user clicks additional column headers", function () { - beforeEach(function () { - container.find('.slick-header-column')[1].click(); - }); - - it("selects additional columns", function () { - container.find('.slick-header-column')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - var column1 = selectedRanges[0]; - - expect(selectedRanges.length).toEqual(2); - expect(column1.fromCell).toBe(1); - expect(column1.toCell).toBe(1); - - var column2 = selectedRanges[1]; - - expect(column2.fromCell).toBe(0); - expect(column2.toCell).toBe(0); - }); - }); - - describe("when the user clicks a column header checkbox", function () { - it("selects the column", function () { - container.find('.slick-header-columns input')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expectOnlyTheFirstColumnToBeSelected(selectedRanges); - }); - - it("checks the checkbox", function () { - container.find('.slick-header-column')[1].click(); - expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeTruthy(); - }); - }); - - describe("when a row is selected", function () { - beforeEach(function () { - var selectedRanges = [new Slick.Range(0, 0, 0, 1)]; - rowSelectionModel.setSelectedRanges(selectedRanges); - }); - - it("deselects the row", function () { - container.find('.slick-header-column')[1].click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - - expect(selectedRanges.length).toBe(1); - - var column = selectedRanges[0]; - - expect(column.fromCell).toBe(1); - expect(column.toCell).toBe(1); - expect(column.fromRow).toBe(0); - expect(column.toRow).toBe(9); - }) - }); - - describe("clicking a second time", function () { - beforeEach(function () { - container.find('.slick-header-column')[1].click(); - }); - - it("unchecks checkbox", function () { - container.find('.slick-header-column')[1].click(); - expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); - }); - - it("deselects the column", function () { - container.find('.slick-header-column')[1].click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - - expect(selectedRanges.length).toEqual(0); - }) - }); - - describe("when the column is not selectable", function () { - it("does not select the column", function () { - $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - - expect(selectedRanges.length).toEqual(0); - }); - }); - - describe("when the column is deselected through setSelectedRanges", function () { - beforeEach(function () { - container.find('.slick-header-column')[1].click(); - }); - - it("unchecks the checkbox", function () { - rowSelectionModel.setSelectedRanges([]); - - expect($(container.find('.slick-header-columns input')[1]) - .is(':checked')).toBeFalsy(); - }); - }); - - describe("when a non-column range was already selected", function () { - beforeEach(function () { - var selectedRanges = [new Slick.Range(0, 0, 1, 0)]; - rowSelectionModel.setSelectedRanges(selectedRanges); - }); - - it("deselects the non-column range", function () { - container.find('.slick-header-column')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expectOnlyTheFirstColumnToBeSelected(selectedRanges); - }) - }); + describe('when the column is deselected through setSelectedRanges', function () { + beforeEach(function () { + container.find('.slick-header-column')[1].click(); }); - var setupGrid = function (columns) { - var columnSelector = new ColumnSelector(); - columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); - var grid = new SlickGrid(container, data, columns, options); + it('unchecks the checkbox', function () { + rowSelectionModel.setSelectedRanges([]); - var rowSelectionModel = new RowSelectionModel(); - grid.setSelectionModel(rowSelectionModel); + expect($(container.find('.slick-header-columns input')[1]) + .is(':checked')).toBeFalsy(); + }); + }); - grid.registerPlugin(columnSelector); - grid.invalidate(); - }; + describe('when a non-column range was already selected', function () { + beforeEach(function () { + var selectedRanges = [new Slick.Range(0, 0, 1, 0)]; + rowSelectionModel.setSelectedRanges(selectedRanges); + }); - function expectOnlyTheFirstColumnToBeSelected(selectedRanges) { - var row = selectedRanges[0]; + it('deselects the non-column range', function () { + container.find('.slick-header-column')[0].click(); - expect(selectedRanges.length).toEqual(1); - expect(row.fromCell).toBe(0); - expect(row.toCell).toBe(0); - expect(row.fromRow).toBe(0); - expect(row.toRow).toBe(9); - } + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expectOnlyTheFirstColumnToBeSelected(selectedRanges); + }); }); }); + + var setupGrid = function (columns) { + var columnSelector = new ColumnSelector(); + columns = columnSelector.getColumnDefinitionsWithCheckboxes(columns); + var grid = new Slick.Grid(container, data, columns, options); + + var rowSelectionModel = new RowSelectionModel(); + grid.setSelectionModel(rowSelectionModel); + + grid.registerPlugin(columnSelector); + grid.invalidate(); + }; + + function expectOnlyTheFirstColumnToBeSelected(selectedRanges) { + var row = selectedRanges[0]; + + expect(selectedRanges.length).toEqual(1); + expect(row.fromCell).toBe(0); + expect(row.toCell).toBe(0); + expect(row.fromRow).toBe(0); + expect(row.toRow).toBe(9); + } +}); diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js index affad66e..ffb0deca 100644 --- a/web/regression/javascript/selection/copy_data_spec.js +++ b/web/regression/javascript/selection/copy_data_spec.js @@ -1,119 +1,128 @@ -define( - ["jquery", - "slickgrid/slick.grid", - "slickgrid/slick.rowselectionmodel", - "sources/selection/copy_data", - "sources/selection/clipboard", - "sources/selection/range_selection_helper" - ], - function ($, SlickGrid, RowSelectionModel, copyData, clipboard, RangeSelectionHelper) { - describe('copyData', function () { - var grid, sqlEditor; - - beforeEach(function () { - var data = [[1, "leopord", "12"], - [2, "lion", "13"], - [3, "puma", "9"]]; - - var columns = [{ - name: "id", - pos: 0, - label: "id
numeric", - cell: "number", - can_edit: false, - type: "numeric" - }, { - name: "brand", - pos: 1, - label: "flavor
character varying", - cell: "string", - can_edit: false, - type: "character varying" - }, { - name: "size", - pos: 2, - label: "size
numeric", - cell: "number", - can_edit: false, - type: "numeric" - } - ] - ; - var gridContainer = $("
"); - $("body").append(gridContainer); - $("body").append(""); - grid = new Slick.Grid("#grid", data, columns, {}); - grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false})); - sqlEditor = {slickgrid: grid}; - }); +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2017, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////////////////// + +import $ from 'jquery'; + +import Slick from 'slickgrid'; +import 'slickgrid.grid'; + +import clipboard from '../../../pgadmin/static/js/selection/clipboard'; +import copyData from '../../../pgadmin/static/js/selection/copy_data'; + +import RangeSelectionHelper from 'sources/selection/range_selection_helper'; + +describe('copyData', function () { + var grid, sqlEditor; + + beforeEach(function () { + var data = [[1, 'leopord', '12'], + [2, 'lion', '13'], + [3, 'puma', '9']]; + + var columns = [{ + name: 'id', + pos: 0, + label: 'id
numeric', + cell: 'number', + can_edit: false, + type: 'numeric', + }, { + name: 'brand', + pos: 1, + label: 'flavor
character varying', + cell: 'string', + can_edit: false, + type: 'character varying', + }, { + name: 'size', + pos: 2, + label: 'size
numeric', + cell: 'number', + can_edit: false, + type: 'numeric', + }, + ] + ; + var gridContainer = $('
'); + $('body').append(gridContainer); + $('body').append(''); + grid = new Slick.Grid('#grid', data, columns, {}); + grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false})); + sqlEditor = {slickgrid: grid}; + }); - afterEach(function() { - $("body").remove('#grid'); - $("body").remove('#btn-paste-row'); - }); + afterEach(function () { + $('body').remove('#grid'); + $('body').remove('#btn-paste-row'); + }); - describe("when rows are selected", function () { - beforeEach(function () { - grid.getSelectionModel().setSelectedRanges([ - RangeSelectionHelper.rangeForRow(grid, 0), - RangeSelectionHelper.rangeForRow(grid, 2)] - ); - }); + describe('when rows are selected', function () { + beforeEach(function () { + grid.getSelectionModel().setSelectedRanges([ + RangeSelectionHelper.rangeForRow(grid, 0), + RangeSelectionHelper.rangeForRow(grid, 2)] + ); + }); - it("copies them", function () { - spyOn(clipboard, 'copyTextToClipboard'); + it('copies them', function () { + spyOn(clipboard, 'copyTextToClipboard'); - copyData.apply(sqlEditor); + copyData.apply(sqlEditor); - expect(sqlEditor.copied_rows.length).toBe(2); + expect(sqlEditor.copied_rows.length).toBe(2); - expect(clipboard.copyTextToClipboard).toHaveBeenCalled(); - expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("1,'leopord','12'"); - expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("3,'puma','9'"); - }); + expect(clipboard.copyTextToClipboard).toHaveBeenCalled(); + expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('1,\'leopord\',\'12\''); + expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('3,\'puma\',\'9\''); + }); - describe("when the user can edit the grid", function () { - it("enables the paste row button", function () { - copyData.apply(_.extend({can_edit: true}, sqlEditor)); + describe('when the user can edit the grid', function () { + it('enables the paste row button', function () { + copyData.apply(_.extend({can_edit: true}, sqlEditor)); - expect($("#btn-paste-row").prop('disabled')).toBe(false); - }); - }); + expect($('#btn-paste-row').prop('disabled')).toBe(false); }); + }); + }); - describe("when a column is selected", function () { - beforeEach(function () { - var firstColumn = new Slick.Range(0, 0, 2, 0); - grid.getSelectionModel().setSelectedRanges([firstColumn]) - }); + describe('when a column is selected', function () { + beforeEach(function () { + var firstColumn = new Slick.Range(0, 0, 2, 0); + grid.getSelectionModel().setSelectedRanges([firstColumn]); + }); - it("copies text to the clipboard", function () { - spyOn(clipboard, 'copyTextToClipboard'); + it('copies text to the clipboard', function () { + spyOn(clipboard, 'copyTextToClipboard'); - copyData.apply(sqlEditor); + copyData.apply(sqlEditor); - expect(clipboard.copyTextToClipboard).toHaveBeenCalled(); + expect(clipboard.copyTextToClipboard).toHaveBeenCalled(); - var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0]; - var rowStrings = copyArg.split('\n'); - expect(rowStrings[0]).toBe("1"); - expect(rowStrings[1]).toBe("2"); - expect(rowStrings[2]).toBe("3"); - }); + var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0]; + var rowStrings = copyArg.split('\n'); + expect(rowStrings[0]).toBe('1'); + expect(rowStrings[1]).toBe('2'); + expect(rowStrings[2]).toBe('3'); + }); - it("sets copied_rows to empty", function () { - copyData.apply(sqlEditor); + it('sets copied_rows to empty', function () { + copyData.apply(sqlEditor); - expect(sqlEditor.copied_rows.length).toBe(0); - }); + expect(sqlEditor.copied_rows.length).toBe(0); + }); - describe("when the user can edit the grid", function () { - it("disables the paste row button", function () { - copyData.apply(_.extend({can_edit: true}, sqlEditor)); + describe('when the user can edit the grid', function () { + it('disables the paste row button', function () { + copyData.apply(_.extend({can_edit: true}, sqlEditor)); - expect($("#btn-paste-row").prop('disabled')).toBe(true); - }); - }); + expect($('#btn-paste-row').prop('disabled')).toBe(true); }); }); }); +}); \ No newline at end of file diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js index a74a66f9..22886b77 100644 --- a/web/regression/javascript/selection/grid_selector_spec.js +++ b/web/regression/javascript/selection/grid_selector_spec.js @@ -1,126 +1,127 @@ -define(["jquery", - "underscore", - "slickgrid/slick.grid", - "slickgrid/slick.rowselectionmodel", - "sources/selection/grid_selector" - ], - function ($, _, SlickGrid, RowSelectionModel, GridSelector) { - describe("GridSelector", function () { - var container, data, columns, gridSelector, rowSelectionModel; +import $ from 'jquery'; - beforeEach(function () { - container = $("
"); - container.height(9999); - columns = [{ - id: '1', - name: 'some-column-name', - }, { - id: '2', - name: 'second column', - }]; - - gridSelector = new GridSelector(); - columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns); - - data = []; - for (var i = 0; i < 10; i++) { - data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i}); - } - var grid = new SlickGrid(container, data, columns); - - rowSelectionModel = new RowSelectionModel(); - grid.setSelectionModel(rowSelectionModel); - - grid.registerPlugin(gridSelector); - grid.invalidate(); - - $("body").append(container); - }); +import Slick from 'slickgrid'; +import 'slickgrid.grid'; - afterEach(function () { - $("body").find(container).remove(); - }); +import RowSelectionModel from 'slickgrid.rowselectionmodel'; - it("renders an additional column on the left for selecting rows", function () { - expect(columns.length).toBe(3); +import GridSelector from 'sources/selection/grid_selector'; - var leftmostColumn = columns[0]; - expect(leftmostColumn.id).toBe('row-header-column'); - }); +describe('GridSelector', function () { + var container, data, columns, gridSelector, rowSelectionModel; - it("renders checkboxes for selecting columns", function () { - expect(container.find('[data-test="output-column-header"] input').length).toBe(2) - }); + beforeEach(function () { + container = $('
'); + container.height(9999); + columns = [{ + id: '1', + name: 'some-column-name', + }, { + id: '2', + name: 'second column', + }]; - it("renders a checkbox for selecting all the cells", function () { - expect(container.find("[title='Select/Deselect All']").length).toBe(1); - }); + gridSelector = new GridSelector(); + columns = gridSelector.getColumnDefinitionsWithCheckboxes(columns); + + data = []; + for (var i = 0; i < 10; i++) { + data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i}); + } + var grid = new Slick.Grid(container, data, columns); + + rowSelectionModel = new RowSelectionModel(); + grid.setSelectionModel(rowSelectionModel); + + grid.registerPlugin(gridSelector); + grid.invalidate(); + + $('body').append(container); + }); + + afterEach(function () { + $('body').find(container).remove(); + }); + + it('renders an additional column on the left for selecting rows', function () { + expect(columns.length).toBe(3); + + var leftmostColumn = columns[0]; + expect(leftmostColumn.id).toBe('row-header-column'); + }); + + it('renders checkboxes for selecting columns', function () { + expect(container.find('[data-test="output-column-header"] input').length).toBe(2); + }); + + it('renders a checkbox for selecting all the cells', function () { + expect(container.find('[title=\'Select/Deselect All\']').length).toBe(1); + }); + + describe('when the cell for the select/deselect all is clicked', function () { + it('selects the whole grid', function () { + container.find('[title=\'Select/Deselect All\']').parent().click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expect(selectedRanges.length).toBe(1); + var selectedRange = selectedRanges[0]; + expect(selectedRange.fromCell).toBe(1); + expect(selectedRange.toCell).toBe(2); + expect(selectedRange.fromRow).toBe(0); + expect(selectedRange.toRow).toBe(9); + }); + + it('checks the checkbox', function () { + container.find('[title=\'Select/Deselect All\']').parent().click(); + + expect($(container.find('[data-id=\'checkbox-select-all\']')).is(':checked')).toBeTruthy(); + }); + }); - describe("when the cell for the select/deselect all is clicked", function () { - it("selects the whole grid", function () { - container.find("[title='Select/Deselect All']").parent().click(); + describe('when the main checkbox in the corner gets selected', function () { + it('unchecks all the columns', function () { + container.find('[title=\'Select/Deselect All\']').click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect(selectedRanges.length).toBe(1); - var selectedRange = selectedRanges[0]; - expect(selectedRange.fromCell).toBe(1); - expect(selectedRange.toCell).toBe(2); - expect(selectedRange.fromRow).toBe(0); - expect(selectedRange.toRow).toBe(9); - }); + expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); + expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy(); + }); - it("checks the checkbox", function () { - container.find("[title='Select/Deselect All']").parent().click(); + it('selects all the cells', function () { + container.find('[title=\'Select/Deselect All\']').click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expect(selectedRanges.length).toBe(1); + var selectedRange = selectedRanges[0]; + expect(selectedRange.fromCell).toBe(1); + expect(selectedRange.toCell).toBe(2); + expect(selectedRange.fromRow).toBe(0); + expect(selectedRange.toRow).toBe(9); + }); - expect($(container.find("[data-id='checkbox-select-all']")).is(':checked')).toBeTruthy(); - }) + describe('when the main checkbox in the corner gets deselected', function () { + beforeEach(function () { + container.find('[title=\'Select/Deselect All\']').click(); }); - describe("when the main checkbox in the corner gets selected", function () { - it("unchecks all the columns", function () { - container.find("[title='Select/Deselect All']").click(); - - expect($(container.find('.slick-header-columns input')[1]).is(':checked')).toBeFalsy(); - expect($(container.find('.slick-header-columns input')[2]).is(':checked')).toBeFalsy(); - }); - - it("selects all the cells", function () { - container.find("[title='Select/Deselect All']").click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect(selectedRanges.length).toBe(1); - var selectedRange = selectedRanges[0]; - expect(selectedRange.fromCell).toBe(1); - expect(selectedRange.toCell).toBe(2); - expect(selectedRange.fromRow).toBe(0); - expect(selectedRange.toRow).toBe(9); - }); - - describe("when the main checkbox in the corner gets deselected", function () { - beforeEach(function () { - container.find("[title='Select/Deselect All']").click(); - }); - - it("deselects all the cells", function () { - container.find("[title='Select/Deselect All']").click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect(selectedRanges.length).toBe(0); - }); - }); - - describe("and then the underlying selection changes", function () { - beforeEach(function () { - container.find("[title='Select/Deselect All']").click(); - }); - - it("unchecks the main checkbox", function () { - var ranges = [new Slick.Range(0, 0, 0, 1)]; - rowSelectionModel.setSelectedRanges(ranges); - - expect($(container.find("[title='Select/Deselect All']")).is(':checked')).toBeFalsy(); - }); - }); + it('deselects all the cells', function () { + container.find('[title=\'Select/Deselect All\']').click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expect(selectedRanges.length).toBe(0); + }); + }); + + describe('and then the underlying selection changes', function () { + beforeEach(function () { + container.find('[title=\'Select/Deselect All\']').click(); + }); + + it('unchecks the main checkbox', function () { + var ranges = [new Slick.Range(0, 0, 0, 1)]; + rowSelectionModel.setSelectedRanges(ranges); + + expect($(container.find('[title=\'Select/Deselect All\']')).is(':checked')).toBeFalsy(); }); }); }); +}); \ No newline at end of file diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js index 8376d0a7..6e9173d1 100644 --- a/web/regression/javascript/selection/range_boundary_navigator_spec.js +++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js @@ -1,8 +1,20 @@ -define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNavigator) { - - describe("#getUnion", function () { - describe("when the ranges completely overlap", function () { - it("returns a list with that range", function () { +////////////////////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2017, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////////////////// + +import rangeBoundaryNavigator from 'sources/selection/range_boundary_navigator'; +import Slick from 'slickgrid'; + +describe('RangeBoundaryNavigator', function () { + + describe('#getUnion', function () { + describe('when the ranges completely overlap', function () { + it('returns a list with that range', function () { var ranges = [[1, 4], [1, 4], [1, 4]]; var union = rangeBoundaryNavigator.getUnion(ranges); @@ -11,8 +23,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa }); }); - describe("when the ranges all overlap partially or touch", function () { - it("returns one long range", function () { + describe('when the ranges all overlap partially or touch', function () { + it('returns one long range', function () { var rangeBounds = [[3, 6], [1, 4], [7, 14]]; var union = rangeBoundaryNavigator.getUnion(rangeBounds); @@ -20,7 +32,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa expect(union).toEqual([[1, 14]]); }); - it("returns them in order from lowest to highest", function () { + it('returns them in order from lowest to highest', function () { var rangeBounds = [[3, 6], [2, 3], [10, 12]]; var union = rangeBoundaryNavigator.getUnion(rangeBounds); @@ -28,9 +40,9 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa expect(union).toEqual([[2, 6], [10, 12]]); }); - describe("when one range completely overlaps another", function() { + describe('when one range completely overlaps another', function() { - it("returns them in order from lowest to highest", function () { + it('returns them in order from lowest to highest', function () { var rangeBounds = [[9, 14], [2, 3], [11, 13]]; var union = rangeBoundaryNavigator.getUnion(rangeBounds); @@ -39,19 +51,19 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa }); }); - describe("when one range is a subset of another", function () { - it("returns the larger range", function () { + describe('when one range is a subset of another', function () { + it('returns the larger range', function () { var rangeBounds = [[2, 6], [1, 14], [8, 10]]; var union = rangeBoundaryNavigator.getUnion(rangeBounds); expect(union).toEqual([[1, 14]]); - }) - }) + }); + }); }); - describe("when the ranges do not touch", function () { - it("returns them in order from lowest to highest", function () { + describe('when the ranges do not touch', function () { + it('returns them in order from lowest to highest', function () { var rangeBounds = [[3, 6], [1, 1], [8, 10]]; var union = rangeBoundaryNavigator.getUnion(rangeBounds); @@ -62,8 +74,8 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa }); - describe("#mapDimensionBoundaryUnion", function () { - it("returns a list of the results of the callback", function () { + describe('#mapDimensionBoundaryUnion', function () { + it('returns a list of the results of the callback', function () { var rangeBounds = [[0, 1], [3, 3]]; var callback = function () { return 'hello'; @@ -72,7 +84,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa expect(result).toEqual(['hello', 'hello', 'hello']); }); - it("calls the callback with each index in the dimension", function () { + it('calls the callback with each index in the dimension', function () { var rangeBounds = [[0, 1], [3, 3]]; var callback = jasmine.createSpy('callbackSpy'); rangeBoundaryNavigator.mapDimensionBoundaryUnion(rangeBounds, callback); @@ -80,7 +92,7 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa }); }); - describe("#mapOver2DArray", function () { + describe('#mapOver2DArray', function () { var data, rowCollector, processCell; beforeEach(function () { data = [[0, 1, 2, 3], [2, 2, 2, 2], [4, 5, 6, 7]]; @@ -92,66 +104,66 @@ define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNa }; }); - it("calls the callback for each item in the ranges", function () { + it('calls the callback for each item in the ranges', function () { var rowRanges = [[0, 0], [2, 2]]; var colRanges = [[0, 3]]; var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector); - expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]); + expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']); }); - describe("when the ranges are out of order/duplicated", function () { + describe('when the ranges are out of order/duplicated', function () { var rowRanges, colRanges; beforeEach(function () { rowRanges = [[2, 2], [2, 2], [0, 0]]; colRanges = [[0, 3]]; }); - it("uses the union of the ranges", function () { - spyOn(rangeBoundaryNavigator, "getUnion").and.callThrough(); + it('uses the union of the ranges', function () { + spyOn(rangeBoundaryNavigator, 'getUnion').and.callThrough(); var selectionResult = rangeBoundaryNavigator.mapOver2DArray(rowRanges, colRanges, processCell, rowCollector); expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(rowRanges); expect(rangeBoundaryNavigator.getUnion).toHaveBeenCalledWith(colRanges); - expect(selectionResult).toEqual(["[0,1,2,3]", "[4,5,6,7]"]); + expect(selectionResult).toEqual(['[0,1,2,3]', '[4,5,6,7]']); }); }); }); - describe("#rangesToCsv", function () { + describe('#rangesToCsv', function () { var data, columnDefinitions, ranges; beforeEach(function () { - data = [[1, "leopard", "12"], - [2, "lion", "13"], - [3, "cougar", "9"], - [4, "tiger", "10"]]; + data = [[1, 'leopard', '12'], + [2, 'lion', '13'], + [3, 'cougar', '9'], + [4, 'tiger', '10']]; columnDefinitions = [{name: 'id', pos: 0}, {name: 'animal', pos: 1}, {name: 'size', pos: 2}]; ranges = [new Slick.Range(0, 0, 0, 2), new Slick.Range(3, 0, 3, 2)]; }); - it("returns csv for the provided ranges", function () { + it('returns csv for the provided ranges', function () { var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges); - expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'"); + expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\''); }); - describe("when there is an extra column with checkboxes", function () { + describe('when there is an extra column with checkboxes', function () { beforeEach(function () { columnDefinitions = [{name: 'not-a-data-column'}, {name: 'id', pos: 0}, {name: 'animal', pos: 1}, { name: 'size', - pos: 2 + pos: 2, }]; ranges = [new Slick.Range(0, 0, 0, 3), new Slick.Range(3, 0, 3, 3)]; }); - it("returns csv for the columns with data", function () { + it('returns csv for the columns with data', function () { var csvResult = rangeBoundaryNavigator.rangesToCsv(data, columnDefinitions, ranges); - expect(csvResult).toEqual("1,'leopard','12'\n4,'tiger','10'"); + expect(csvResult).toEqual('1,\'leopard\',\'12\'\n4,\'tiger\',\'10\''); }); }); }); diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js index 10697e6a..be741d42 100644 --- a/web/regression/javascript/selection/row_selector_spec.js +++ b/web/regression/javascript/selection/row_selector_spec.js @@ -1,174 +1,172 @@ -define( - ["jquery", - "underscore", - "slickgrid/slick.grid", - "sources/selection/row_selector", - "slickgrid/slick.rowselectionmodel", - "slickgrid", - ], - function ($, _, SlickGrid, RowSelector, RowSelectionModel, Slick) { - describe("RowSelector", function () { - var container, data, columnDefinitions, grid, rowSelectionModel; +import $ from 'jquery'; + +import Slick from 'slickgrid'; +import 'slickgrid.grid'; +import RowSelectionModel from 'slickgrid.rowselectionmodel'; + +import RowSelector from 'sources/selection/row_selector'; + +describe('RowSelector', function () { + var container, data, columnDefinitions, grid, rowSelectionModel; + + beforeEach(function () { + container = $('
'); + container.height(9999); + + columnDefinitions = [{ + id: '1', + name: 'some-column-name', + selectable: true, + }, { + id: '2', + name: 'second column', + selectable: true, + }]; + + var rowSelector = new RowSelector(); + data = []; + for (var i = 0; i < 10; i++) { + data.push(['some-value-' + i, 'second value ' + i]); + } + columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions); + grid = new Slick.Grid(container, data, columnDefinitions); + + rowSelectionModel = new RowSelectionModel(); + grid.setSelectionModel(rowSelectionModel); + grid.registerPlugin(rowSelector); + grid.invalidate(); + + $('body').append(container); + }); + + afterEach(function () { + $('body').find(container).remove(); + }); + + it('renders an additional column on the left', function () { + expect(columnDefinitions.length).toBe(3); + + var leftmostColumn = columnDefinitions[0]; + expect(leftmostColumn.id).toBe('row-header-column'); + expect(leftmostColumn.name).toBe(''); + expect(leftmostColumn.selectable).toBe(false); + }); + + it('renders a checkbox the leftmost column', function () { + expect(container.find('.sr').length).toBe(11); + expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10); + }); + + it('preserves the other attributes of column definitions', function () { + expect(columnDefinitions[1].id).toBe('1'); + expect(columnDefinitions[1].selectable).toBe(true); + }); + + describe('selecting rows', function () { + describe('when the user clicks a row header checkbox', function () { + it('selects the row', function () { + container.find('.sr .sc:first-child input[type="checkbox"]')[0].click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expectOnlyTheFirstRowToBeSelected(selectedRanges); + }); - beforeEach(function () { - container = $("
"); - container.height(9999); - - columnDefinitions = [{ - id: '1', - name: 'some-column-name', - selectable: true - }, { - id: '2', - name: 'second column', - selectable: true - }]; - - var rowSelector = new RowSelector(); - data = []; - for (var i = 0; i < 10; i++) { - data.push(['some-value-' + i, 'second value ' + i]); - } - columnDefinitions = rowSelector.getColumnDefinitionsWithCheckboxes(columnDefinitions); - grid = new SlickGrid(container, data, columnDefinitions); - - rowSelectionModel = new RowSelectionModel(); - grid.setSelectionModel(rowSelectionModel); - grid.registerPlugin(rowSelector); - grid.invalidate(); - - $("body").append(container); + it('checks the checkbox', function () { + container.find('.sr .sc:first-child input[type="checkbox"]')[5].click(); + + expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5]) + .is(':checked')).toBeTruthy(); + }); + }); + + describe('when the user clicks a row header', function () { + it('selects the row', function () { + container.find('.sr .sc:first-child')[0].click(); + + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expectOnlyTheFirstRowToBeSelected(selectedRanges); }); - afterEach(function () { - $("body").find(container).remove(); + it('checks the checkbox', function () { + container.find('.sr .sc:first-child')[7].click(); + + expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7]) + .is(':checked')).toBeTruthy(); }); + }); + + describe('when the user clicks multiple row headers', function () { + it('selects another row', function () { + container.find('.sr .sc:first-child')[4].click(); + container.find('.sr .sc:first-child')[0].click(); - it("renders an additional column on the left", function () { - expect(columnDefinitions.length).toBe(3); + var selectedRanges = rowSelectionModel.getSelectedRanges(); + expect(selectedRanges.length).toEqual(2); + + var row1 = selectedRanges[0]; + expect(row1.fromRow).toBe(4); + expect(row1.toRow).toBe(4); + + var row2 = selectedRanges[1]; + expect(row2.fromRow).toBe(0); + expect(row2.toRow).toBe(0); + }); + }); - var leftmostColumn = columnDefinitions[0]; - expect(leftmostColumn.id).toBe('row-header-column'); - expect(leftmostColumn.name).toBe(''); - expect(leftmostColumn.selectable).toBe(false); + describe('when a column was already selected', function () { + beforeEach(function () { + var selectedRanges = [new Slick.Range(0, 0, 0, 1)]; + rowSelectionModel.setSelectedRanges(selectedRanges); }); - it("renders a checkbox the leftmost column", function () { - expect(container.find('.sr').length).toBe(11); - expect(container.find('.sr .sc:first-child input[type="checkbox"]').length).toBe(10); + it('deselects the column', function () { + container.find('.sr .sc:first-child')[0].click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); + + expectOnlyTheFirstRowToBeSelected(selectedRanges); }); + }); - it("preserves the other attributes of column definitions", function () { - expect(columnDefinitions[1].id).toBe('1'); - expect(columnDefinitions[1].selectable).toBe(true); + describe('when the row is deselected through setSelectedRanges', function () { + beforeEach(function () { + container.find('.sr .sc:first-child')[4].click(); }); - describe("selecting rows", function () { - describe("when the user clicks a row header checkbox", function () { - it("selects the row", function () { - container.find('.sr .sc:first-child input[type="checkbox"]')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expectOnlyTheFirstRowToBeSelected(selectedRanges); - }); - - it("checks the checkbox", function () { - container.find('.sr .sc:first-child input[type="checkbox"]')[5].click(); - - expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[5]) - .is(':checked')).toBeTruthy(); - }); - }); - - describe("when the user clicks a row header", function () { - it("selects the row", function () { - container.find('.sr .sc:first-child')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expectOnlyTheFirstRowToBeSelected(selectedRanges); - }); - - it("checks the checkbox", function () { - container.find('.sr .sc:first-child')[7].click(); - - expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[7]) - .is(':checked')).toBeTruthy(); - }); - }); - - describe("when the user clicks multiple row headers", function () { - it("selects another row", function () { - container.find('.sr .sc:first-child')[4].click(); - container.find('.sr .sc:first-child')[0].click(); - - var selectedRanges = rowSelectionModel.getSelectedRanges(); - expect(selectedRanges.length).toEqual(2); - - var row1 = selectedRanges[0]; - expect(row1.fromRow).toBe(4); - expect(row1.toRow).toBe(4); - - var row2 = selectedRanges[1]; - expect(row2.fromRow).toBe(0); - expect(row2.toRow).toBe(0); - }); - }); - - describe("when a column was already selected", function () { - beforeEach(function () { - var selectedRanges = [new Slick.Range(0, 0, 0, 1)]; - rowSelectionModel.setSelectedRanges(selectedRanges); - }); - - it("deselects the column", function () { - container.find('.sr .sc:first-child')[0].click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - - expectOnlyTheFirstRowToBeSelected(selectedRanges); - }) - }); - - describe("when the row is deselected through setSelectedRanges", function () { - beforeEach(function () { - container.find('.sr .sc:first-child')[4].click(); - }); - - it("should uncheck the checkbox", function () { - rowSelectionModel.setSelectedRanges([]); - - expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4]) - .is(':checked')).toBeFalsy(); - }); - }); - - describe("click a second time", function () { - beforeEach(function () { - container.find('.sr .sc:first-child')[1].click(); - }); - - it("unchecks checkbox", function () { - container.find('.sr .sc:first-child')[1].click(); - expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1]) - .is(':checked')).toBeFalsy(); - }); - - it("unselects the row", function () { - container.find('.sr .sc:first-child')[1].click(); - var selectedRanges = rowSelectionModel.getSelectedRanges(); - - expect(selectedRanges.length).toEqual(0); - }) - }); + it('should uncheck the checkbox', function () { + rowSelectionModel.setSelectedRanges([]); + + expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[4]) + .is(':checked')).toBeFalsy(); }); }); - function expectOnlyTheFirstRowToBeSelected(selectedRanges) { - var row = selectedRanges[0]; + describe('click a second time', function () { + beforeEach(function () { + container.find('.sr .sc:first-child')[1].click(); + }); + + it('unchecks checkbox', function () { + container.find('.sr .sc:first-child')[1].click(); + expect($(container.find('.sr .sc:first-child input[type="checkbox"]')[1]) + .is(':checked')).toBeFalsy(); + }); - expect(selectedRanges.length).toEqual(1); - expect(row.fromCell).toBe(1); - expect(row.toCell).toBe(2); - expect(row.fromRow).toBe(0); - expect(row.toRow).toBe(0); - } - }); \ No newline at end of file + it('unselects the row', function () { + container.find('.sr .sc:first-child')[1].click(); + var selectedRanges = rowSelectionModel.getSelectedRanges(); + + expect(selectedRanges.length).toEqual(0); + }); + }); + }); +}); + +function expectOnlyTheFirstRowToBeSelected(selectedRanges) { + var row = selectedRanges[0]; + + expect(selectedRanges.length).toEqual(1); + expect(row.fromCell).toBe(1); + expect(row.toCell).toBe(2); + expect(row.fromRow).toBe(0); + expect(row.toRow).toBe(0); +} \ No newline at end of file diff --git a/web/regression/javascript/selection/set_staged_rows_spec.js b/web/regression/javascript/selection/set_staged_rows_spec.js index 11e293fd..ebecc4b0 100644 --- a/web/regression/javascript/selection/set_staged_rows_spec.js +++ b/web/regression/javascript/selection/set_staged_rows_spec.js @@ -8,9 +8,9 @@ ////////////////////////////////////////////////////////////// define([ - "jquery", - "underscore", - "sources/selection/set_staged_rows", + 'jquery', + 'underscore', + 'sources/selection/set_staged_rows', ], function ($, _, SetStagedRows) { describe('when no full rows are selected', function () { var sqlEditorObj, deleteButton, copyButton; @@ -20,7 +20,7 @@ define([ {0: 'one', 1: 'two', __temp_PK: '123'}, {0: 'three', 1: 'four', __temp_PK: '456'}, {0: 'five', 1: 'six', __temp_PK: '789'}, - {0: 'seven', 1: 'eight', __temp_PK: '432'} + {0: 'seven', 1: 'eight', __temp_PK: '432'}, ]); deleteButton = $(''); copyButton = $(''); @@ -29,10 +29,10 @@ define([ editor: { handler: { data_store: { - staged_rows: {1: [1, 2]} - } - } - } + staged_rows: {1: [1, 2]}, + }, + }, + }, }; $('body').append(deleteButton); $('body').append(copyButton); @@ -93,7 +93,7 @@ define([ {0: 'one', 1: 'two', __temp_PK: '123'}, {0: 'three', 1: 'four', __temp_PK: '456'}, {0: 'five', 1: 'six', __temp_PK: '789'}, - {0: 'seven', 1: 'eight', __temp_PK: '432'} + {0: 'seven', 1: 'eight', __temp_PK: '432'}, ]); var selectionSpy = jasmine.createSpyObj('selectionSpy', ['getSelectedRows', 'setSelectedRows']); @@ -107,23 +107,23 @@ define([ editor: { handler: { data_store: { - staged_rows: {'456': {}} + staged_rows: {'456': {}}, }, - can_edit: false - } + can_edit: false, + }, }, keys: null, selection: selectionSpy, columns: [ { name: 'a pk column', - pos: 0 + pos: 0, }, { name: 'some column', - pos: 1 - } - ] + pos: 1, + }, + ], }; $('body').append(deleteButton); @@ -190,7 +190,7 @@ define([ {0: 'one', 1: 'two', __temp_PK: '123'}, {1: 'four', __temp_PK: '456'}, {1: 'six', __temp_PK: '789'}, - {0: 'seven', 1: 'eight', __temp_PK: '432'} + {0: 'seven', 1: 'eight', __temp_PK: '432'}, ]); }); @@ -224,7 +224,7 @@ define([ it('should not clear the staged rows', function () { expect(sqlEditorObj.editor.handler.data_store.staged_rows).toEqual({ '456': {0: 'three'}, - '789': {0: 'five'} + '789': {0: 'five'}, }); }); diff --git a/web/regression/javascript/size_prettify_spec.js b/web/regression/javascript/size_prettify_spec.js index 7d370fcb..f60c79c0 100644 --- a/web/regression/javascript/size_prettify_spec.js +++ b/web/regression/javascript/size_prettify_spec.js @@ -7,59 +7,59 @@ // ////////////////////////////////////////////////////////////////////////// -define(["sources/size_prettify"], function (sizePrettify) { - describe("sizePrettify", function () { - describe("when size is 0", function () { - it("returns 0 bytes", function () { - expect(sizePrettify(0)).toEqual("0 bytes"); +define(['sources/size_prettify'], function (sizePrettify) { + describe('sizePrettify', function () { + describe('when size is 0', function () { + it('returns 0 bytes', function () { + expect(sizePrettify(0)).toEqual('0 bytes'); }); }); - describe("when size >= 10kB and size < 10 MB", function () { - it("returns size in kB", function () { - expect(sizePrettify(10240)).toEqual("10 kB"); + describe('when size >= 10kB and size < 10 MB', function () { + it('returns size in kB', function () { + expect(sizePrettify(10240)).toEqual('10 kB'); }); - it("returns size in kB", function () { - expect(sizePrettify(99999)).toEqual("98 kB"); + it('returns size in kB', function () { + expect(sizePrettify(99999)).toEqual('98 kB'); }); }); - describe("when size >= 10MB and size < 10 GB", function () { - it("returns size in MB", function () { - expect(sizePrettify(10485760)).toEqual("10 MB"); + describe('when size >= 10MB and size < 10 GB', function () { + it('returns size in MB', function () { + expect(sizePrettify(10485760)).toEqual('10 MB'); }); - it("returns size in MB", function () { - expect(sizePrettify(44040192)).toEqual("42 MB"); + it('returns size in MB', function () { + expect(sizePrettify(44040192)).toEqual('42 MB'); }); }); - describe("when size >= 10GB and size < 10 TB", function () { - it("returns size in GB", function () { - expect(sizePrettify(10737418240)).toEqual("10 GB"); + describe('when size >= 10GB and size < 10 TB', function () { + it('returns size in GB', function () { + expect(sizePrettify(10737418240)).toEqual('10 GB'); }); - it("returns size in GB", function () { - expect(sizePrettify(10736344498176)).toEqual("9999 GB"); + it('returns size in GB', function () { + expect(sizePrettify(10736344498176)).toEqual('9999 GB'); }); }); - describe("when size >= 10TB and size < 10 PB", function () { - it("returns size in TB", function () { - expect(sizePrettify(10995116277760)).toEqual("10 TB"); + describe('when size >= 10TB and size < 10 PB', function () { + it('returns size in TB', function () { + expect(sizePrettify(10995116277760)).toEqual('10 TB'); }); - it("returns size in TB", function () { - expect(sizePrettify(29995116277760)).toEqual("27 TB"); + it('returns size in TB', function () { + expect(sizePrettify(29995116277760)).toEqual('27 TB'); }); }); - describe("when size >= 10 PB", function () { - it("returns size in PB", function () { - expect(sizePrettify(11258999068426200)).toEqual("10 PB"); + describe('when size >= 10 PB', function () { + it('returns size in PB', function () { + expect(sizePrettify(11258999068426200)).toEqual('10 PB'); }); });