diff --git a/tests/store.test.ts b/tests/store.test.ts index c49abe03..0b07d704 100644 --- a/tests/store.test.ts +++ b/tests/store.test.ts @@ -832,4 +832,76 @@ describe("connecting a component to store", () => { "
taster:aaronconsumed:jupiler
" ); }); + + test("connected component deeply reactive with undefined, null and string props", async () => { + class Beer extends Component { + inlineTemplate = `
+ taster: + selected: + consumed: +
`; + } + const ConnectedBeer = connect((state, props) => { + return { + selected: state.beers[props.id], + consumed: state.beers[state.consumedID] || null, + taster: state.taster, + }; + })(Beer); + + class App extends Component { + inlineTemplate = `
+ +
`; + widgets = { ConnectedBeer }; + state = { beerId: 0 }; + } + + const mutations = { + changeTaster({ state }, newTaster) { + state.taster = newTaster; + }, + consume({ state }, beerId) { + state.consumedID = beerId; + }, + renameBeer({ state }, { beerId, name }) { + state.beers[beerId].name = name; + }, + }; + const state = { + beers: { + 1: { name: "jupiler" } + }, + consumedID: null, + taster: "aaron" + }; + const store = new Store({ state, mutations }); + (env).store = store; + const app = new App(env); + + await app.mount(fixture); + expect(fixture.innerHTML).toBe("
taster:aaron
"); + + await app.updateState({ beerId: 1 }); + expect(fixture.innerHTML).toBe("
taster:aaronselected:jupiler
"); + + store.commit("renameBeer", { beerId: 1, name: "kwak" }); + await nextTick(); + expect(fixture.innerHTML).toBe("
taster:aaronselected:kwak
"); + + store.commit("consume", 1); + await nextTick(); + expect(fixture.innerHTML).toBe("
taster:aaronselected:kwakconsumed:kwak
"); + + await app.updateState({ beerId: 0 }); + expect(fixture.innerHTML).toBe("
taster:aaronconsumed:kwak
"); + + store.commit("renameBeer", { beerId: 1, name: "jupiler" }); + await nextTick(); + expect(fixture.innerHTML).toBe("
taster:aaronconsumed:jupiler
"); + + store.commit("changeTaster", "matthieu"); + await nextTick(); + expect(fixture.innerHTML).toBe("
taster:matthieuconsumed:jupiler
"); + }); });