From 1d56d9a2ce7bc38da56f121bec6c826acada9f43 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Mon, 24 Aug 2020 15:48:34 +0100 Subject: [PATCH] cypress tests, lint, feature complete --- .../cypress/integration/createView.spec.js | 61 +++++++++++---- .../builder/src/builderStore/store/backend.js | 26 ++----- .../builder/src/builderStore/store/index.js | 3 - .../database/DataTable/ViewDataTable.svelte | 12 +-- .../modals/RecordFieldControl.svelte | 16 +--- .../DataTable/popovers/Calculate.svelte | 2 +- .../DataTable/popovers/GroupBy.svelte | 2 +- .../nav/ModelNavigator/ModelNavigator.svelte | 8 +- .../server/src/api/controllers/view/index.js | 4 +- .../__snapshots__/viewBuilder.spec.js.snap | 62 +++++++++++---- .../view/tests/viewBuilder.spec.js | 11 ++- .../src/api/controllers/view/viewBuilder.js | 77 +++++++++++-------- .../tests/__snapshots__/view.spec.js.snap | 48 +++++------- .../server/src/api/routes/tests/view.spec.js | 13 ++-- 14 files changed, 197 insertions(+), 148 deletions(-) diff --git a/packages/builder/cypress/integration/createView.spec.js b/packages/builder/cypress/integration/createView.spec.js index b605135ad4..69433cb6cc 100644 --- a/packages/builder/cypress/integration/createView.spec.js +++ b/packages/builder/cypress/integration/createView.spec.js @@ -1,4 +1,7 @@ + context('Create a View', () => { + const TOTAL_RECORDS = 6 + before(() => { cy.visit('localhost:4001/_builder') cy.createApp('View App', 'View App Description') @@ -7,6 +10,7 @@ context('Create a View', () => { cy.addColumn('data', 'age', 'Number') cy.addColumn('data', 'rating', 'Number') + // 6 Records cy.addRecord(["Students", 25, 1]) cy.addRecord(["Students", 20, 3]) cy.addRecord(["Students", 18, 6]) @@ -15,11 +19,39 @@ context('Create a View', () => { cy.addRecord(["Teachers", 36, 3]) }) - - it('creates a stats view based on age', () => { + it('creates a view', () => { cy.contains("Create New View").click() cy.get("[placeholder='View Name']").type("Test View") cy.contains("Save View").click() + cy.get(".title").contains("Test View") + cy.get("thead th").should(($headers) => { + expect($headers).to.have.length(3) + const headers = $headers.map((i, header) => Cypress.$(header).text()) + expect(headers.get()).to.deep.eq([ + "group", + "age", + "rating" + ]) + }) + }); + + it('filters the view by age over 10', () => { + cy.contains("Filter").click() + cy.contains("Add Filter").click() + cy.get(".menu-container").find("select").first().select("age") + cy.get(".menu-container").find("select").eq(1).select("More Than") + cy.get("input[placeholder='age']").type(18) + cy.contains("Save").click() + cy.get("tbody tr").should(($values) => { + expect($values).to.have.length(5) + }) + }); + + it('creates a stats calculation view based on age', () => { + cy.contains("Calculate").click() + cy.get(".menu-container").find("select").first().select("Statistics") + cy.get(".menu-container").find("select").eq(1).select("age") + cy.contains("Save").click() cy.get("thead th").should(($headers) => { expect($headers).to.have.length(7) const headers = $headers.map((i, header) => Cypress.$(header).text()) @@ -28,8 +60,8 @@ context('Create a View', () => { "sum", "min", "max", - "sumsqr", "count", + "sumsqr", "avg", ]) }) @@ -37,17 +69,17 @@ context('Create a View', () => { const values = $values.map((i, value) => Cypress.$(value).text()) expect(values.get()).to.deep.eq([ "null", - "173", - "18", + "155", + "20", "49", - "5671", - "6", - "28.833333333333332" + "5", + "5347", + "31" ]) }) }) - it('groups the stats view by group', () => { + it('groups the view by group', () => { cy.contains("Group By").click() cy.get("select").select("group") cy.contains("Save").click() @@ -58,12 +90,12 @@ context('Create a View', () => { const values = $values.map((i, value) => Cypress.$(value).text()) expect(values.get()).to.deep.eq([ "Students", - "88", - "18", + "70", + "20", "25", - "1974", - "4", - "22" + "3", + "1650", + "23.333333333333332" ]) }) }) @@ -77,6 +109,7 @@ context('Create a View', () => { }) it('deletes a view', () => { + cy.contains("[data-cy=model-nav-item]", "Test View Updated").click() cy.contains("[data-cy=model-nav-item]", "Test View Updated").find(".ri-more-line").click() cy.contains("Delete").click() cy.get(".content").contains("button", "Delete").click() diff --git a/packages/builder/src/builderStore/store/backend.js b/packages/builder/src/builderStore/store/backend.js index 24955fafc2..fec21a467e 100644 --- a/packages/builder/src/builderStore/store/backend.js +++ b/packages/builder/src/builderStore/store/backend.js @@ -9,10 +9,6 @@ const INITIAL_BACKEND_UI_STATE = { selectedDatabase: {}, selectedModel: {}, draftModel: {}, - tabs: { - SETUP_PANEL: "SETUP", - NAVIGATION_PANEL: "NAVIGATE", - }, } export const getBackendUiStore = () => { @@ -128,7 +124,12 @@ export const getBackendUiStore = () => { }, save: async view => { const response = await api.post(`/api/views`, view) - const viewMeta = await response.json() + const json = await response.json() + + const viewMeta = { + name: view.name, + ...json, + } store.update(state => { const viewModel = state.models.find( @@ -136,13 +137,10 @@ export const getBackendUiStore = () => { ) if (view.originalName) delete viewModel.views[view.originalName] - viewModel.views[view.name] = viewMeta + viewModel.views[view.name] = viewMeta state.models = state.models - state.selectedView = { - name: view.name, - ...viewMeta - } + state.selectedView = viewMeta return state }) }, @@ -159,11 +157,3 @@ export const getBackendUiStore = () => { return store } - -// Store Actions -export const createDatabaseForApp = store => appInstance => { - store.update(state => { - state.appInstances.push(appInstance) - return state - }) -} diff --git a/packages/builder/src/builderStore/store/index.js b/packages/builder/src/builderStore/store/index.js index f5849c480a..c97eb48f25 100644 --- a/packages/builder/src/builderStore/store/index.js +++ b/packages/builder/src/builderStore/store/index.js @@ -1,7 +1,6 @@ import { values, cloneDeep } from "lodash/fp" import { get_capitalised_name } from "../../helpers" import { backendUiStore } from "builderStore" -import * as backendStoreActions from "./backend" import { writable, get } from "svelte/store" import api from "../api" import { DEFAULT_PAGES_OBJECT } from "../../constants" @@ -50,8 +49,6 @@ export const getStore = () => { store.setPackage = setPackage(store, initial) - store.createDatabaseForApp = backendStoreActions.createDatabaseForApp(store) - store.saveScreen = saveScreen(store) store.setCurrentScreen = setCurrentScreen(store) store.setCurrentPage = setCurrentPage(store) diff --git a/packages/builder/src/components/database/DataTable/ViewDataTable.svelte b/packages/builder/src/components/database/DataTable/ViewDataTable.svelte index 2346186409..11e0f85601 100644 --- a/packages/builder/src/components/database/DataTable/ViewDataTable.svelte +++ b/packages/builder/src/components/database/DataTable/ViewDataTable.svelte @@ -19,19 +19,21 @@ import GroupByPopover from "./popovers/GroupBy.svelte" import FilterPopover from "./popovers/Filter.svelte" - export let view = {} let data = [] - $: ({ name, groupBy, filters, field } = view) + $: name = view.name + $: filters = view.filters + $: field = view.field + $: groupBy = view.groupBy $: !name.startsWith("all_") && filters && fetchViewData(name, field, groupBy) async function fetchViewData(name, field, groupBy) { - const params = new URLSearchParams(); + const params = new URLSearchParams() - if (field) params.set("stats", true); - if (groupBy) params.set("group", groupBy); + if (field) params.set("stats", true) + if (groupBy) params.set("group", groupBy) let QUERY_VIEW_URL = `/api/views/${name}?${params}` diff --git a/packages/builder/src/components/database/DataTable/modals/RecordFieldControl.svelte b/packages/builder/src/components/database/DataTable/modals/RecordFieldControl.svelte index 8c3a6b858e..38d5d62064 100644 --- a/packages/builder/src/components/database/DataTable/modals/RecordFieldControl.svelte +++ b/packages/builder/src/components/database/DataTable/modals/RecordFieldControl.svelte @@ -1,33 +1,25 @@