forked from tsai/budibase
1 changed files with 0 additions and 174 deletions
@ -1,174 +0,0 @@ |
|||||
import { setupBinding } from "../src/state/stateBinding" |
|
||||
import { |
|
||||
BB_STATE_BINDINGPATH, |
|
||||
BB_STATE_FALLBACK, |
|
||||
BB_STATE_BINDINGSOURCE, |
|
||||
} from "../src/state/isState" |
|
||||
import { EVENT_TYPE_MEMBER_NAME } from "../src/state/eventHandlers" |
|
||||
import { writable } from "svelte/store" |
|
||||
import { isFunction } from "lodash/fp" |
|
||||
|
|
||||
describe("setupBinding", () => { |
|
||||
it("should correctly create initials props, including fallback values", () => { |
|
||||
const { store, props, component } = testSetup() |
|
||||
|
|
||||
const { initialProps } = testSetupBinding(store, props, component) |
|
||||
|
|
||||
expect(initialProps.boundWithFallback).toBe("Bob") |
|
||||
expect(initialProps.boundNoFallback).toBeUndefined() |
|
||||
expect(initialProps.unbound).toBe("hello") |
|
||||
|
|
||||
expect(isFunction(initialProps.eventBound)).toBeTruthy() |
|
||||
initialProps.eventBound() |
|
||||
}) |
|
||||
|
|
||||
it("should update component bound props when store is updated", () => { |
|
||||
const { component, store, props } = testSetup() |
|
||||
|
|
||||
const { bind } = testSetupBinding(store, props, component) |
|
||||
bind(component) |
|
||||
|
|
||||
store.update(s => { |
|
||||
s.FirstName = "Bobby" |
|
||||
s.LastName = "Thedog" |
|
||||
s.Customer = { |
|
||||
Name: "ACME inc", |
|
||||
Address: "", |
|
||||
} |
|
||||
s.addressToSet = "123 Main Street" |
|
||||
return s |
|
||||
}) |
|
||||
|
|
||||
expect(component.props.boundWithFallback).toBe("Bobby") |
|
||||
expect(component.props.boundNoFallback).toBe("Thedog") |
|
||||
expect(component.props.multiPartBound).toBe("ACME inc") |
|
||||
}) |
|
||||
|
|
||||
it("should not update unbound props when store is updated", () => { |
|
||||
const { component, store, props } = testSetup() |
|
||||
|
|
||||
const { bind } = testSetupBinding(store, props, component) |
|
||||
bind(component) |
|
||||
|
|
||||
store.update(s => { |
|
||||
s.FirstName = "Bobby" |
|
||||
s.LastName = "Thedog" |
|
||||
s.Customer = { |
|
||||
Name: "ACME inc", |
|
||||
Address: "", |
|
||||
} |
|
||||
s.addressToSet = "123 Main Street" |
|
||||
return s |
|
||||
}) |
|
||||
|
|
||||
expect(component.props.unbound).toBe("hello") |
|
||||
}) |
|
||||
|
|
||||
it("should update event handlers on state change", () => { |
|
||||
const { component, store, props } = testSetup() |
|
||||
|
|
||||
const { bind } = testSetupBinding(store, props, component) |
|
||||
bind(component) |
|
||||
|
|
||||
expect(component.props.boundToEventOutput).toBe("initial address") |
|
||||
component.props.eventBound() |
|
||||
expect(component.props.boundToEventOutput).toBe("event fallback address") |
|
||||
|
|
||||
store.update(s => { |
|
||||
s.addressToSet = "123 Main Street" |
|
||||
return s |
|
||||
}) |
|
||||
|
|
||||
component.props.eventBound() |
|
||||
expect(component.props.boundToEventOutput).toBe("123 Main Street") |
|
||||
}) |
|
||||
|
|
||||
it("event handlers should recognise event parameter", () => { |
|
||||
const { component, store, props } = testSetup() |
|
||||
|
|
||||
const { bind } = testSetupBinding(store, props, component) |
|
||||
bind(component) |
|
||||
|
|
||||
expect(component.props.boundToEventOutput).toBe("initial address") |
|
||||
component.props.eventBoundUsingEventParam({ |
|
||||
addressOverride: "Overridden Address", |
|
||||
}) |
|
||||
expect(component.props.boundToEventOutput).toBe("Overridden Address") |
|
||||
|
|
||||
store.update(s => { |
|
||||
s.addressToSet = "123 Main Street" |
|
||||
return s |
|
||||
}) |
|
||||
|
|
||||
component.props.eventBound() |
|
||||
expect(component.props.boundToEventOutput).toBe("123 Main Street") |
|
||||
|
|
||||
component.props.eventBoundUsingEventParam({ |
|
||||
addressOverride: "Overridden Address", |
|
||||
}) |
|
||||
expect(component.props.boundToEventOutput).toBe("Overridden Address") |
|
||||
}) |
|
||||
|
|
||||
it("should bind initial props to supplied context", () => { |
|
||||
const { component, store, props } = testSetup() |
|
||||
|
|
||||
const { bind } = testSetupBinding(store, props, component, { |
|
||||
ContextValue: "Real Context Value", |
|
||||
}) |
|
||||
bind(component) |
|
||||
|
|
||||
expect(component.props.boundToContext).toBe("Real Context Value") |
|
||||
}) |
|
||||
}); |
|
||||
|
|
||||
const testSetupBinding = (store, props, component, context) => { |
|
||||
const setup = setupBinding(store, props, undefined, context) |
|
||||
component.props = setup.initialProps // svelte does this for us in real life
|
|
||||
return setup |
|
||||
} |
|
||||
const testSetup = () => { |
|
||||
const c = {} |
|
||||
|
|
||||
c.props = {} |
|
||||
c.$set = propsToSet => { |
|
||||
for (let pname in propsToSet) c.props[pname] = propsToSet[pname] |
|
||||
} |
|
||||
|
|
||||
const binding = (path, fallback, source) => ({ |
|
||||
[BB_STATE_BINDINGPATH]: path, |
|
||||
[BB_STATE_FALLBACK]: fallback, |
|
||||
[BB_STATE_BINDINGSOURCE]: source || "store" |
|
||||
}); |
|
||||
|
|
||||
const event = (handlerType, parameters) => ({ |
|
||||
[EVENT_TYPE_MEMBER_NAME]: handlerType, |
|
||||
parameters |
|
||||
}); |
|
||||
|
|
||||
const props = { |
|
||||
boundWithFallback: binding("FirstName", "Bob"), |
|
||||
boundNoFallback: binding("LastName"), |
|
||||
unbound: "hello", |
|
||||
multiPartBound: binding("Customer.Name", "ACME"), |
|
||||
boundToEventOutput: binding("Customer.Address", "initial address"), |
|
||||
boundToContext: binding("ContextValue", "context fallback", "context"), |
|
||||
eventBound: [ |
|
||||
event("Set State", { |
|
||||
path: "Customer.Address", |
|
||||
value: binding("addressToSet", "event fallback address"), |
|
||||
}), |
|
||||
], |
|
||||
eventBoundUsingEventParam: [ |
|
||||
event("Set State", { |
|
||||
path: "Customer.Address", |
|
||||
value: binding("addressOverride", "", "event"), |
|
||||
}), |
|
||||
], |
|
||||
} |
|
||||
|
|
||||
return { |
|
||||
component: c, |
|
||||
store: writable({}), |
|
||||
props, |
|
||||
} |
|
||||
} |
|
||||
Loading…
Reference in new issue