return function() local CorePackages = game:GetService("CorePackages") local Rodux = require(CorePackages.Rodux) local Immutable = require(CorePackages.AppTempCommon.Common.Immutable) local UpdateUsers = require(CorePackages.AppTempCommon.LuaApp.Thunks.UpdateUsers) local AddUsers = require(CorePackages.AppTempCommon.LuaApp.Actions.AddUsers) local SetFriendCount = require(CorePackages.AppTempCommon.LuaApp.Actions.SetFriendCount) local FriendCount = require(CorePackages.AppTempCommon.LuaChat.Reducers.FriendCount) local Users = require(CorePackages.AppTempCommon.LuaApp.Reducers.Users) local User = require(CorePackages.AppTempCommon.LuaApp.Models.User) local function UsersReducerMonitor (state, action) state = state or { numberOfAddUsersCalled = 0, numberOfUsersPassedIn = 0, } if action.type == AddUsers.name then state.numberOfAddUsersCalled = state.numberOfAddUsersCalled + 1 state.numberOfUsersPassedIn = 0 for _, _ in pairs(action.users) do state.numberOfUsersPassedIn = state.numberOfUsersPassedIn + 1 end end return state end local function FriendCountReducerMonitor (state, action) state = state or { numberOfSetFriendCountCalled = 0, } if action.type == SetFriendCount.name then state.numberOfSetFriendCountCalled = state.numberOfSetFriendCountCalled + 1 end return state end local function CustomReducer(state, action) state = state or {} return { Users = Users(state.Users, action), UsersReducerMonitor = UsersReducerMonitor(state.UsersReducerMonitor, action), FriendCount = FriendCount(state.FriendCount, action), FriendCountReducerMonitor = FriendCountReducerMonitor(state.FriendCountReducerMonitor, action), } end local listOfUsers = { ["1"] = User.fromData(1, "Hedonism Bot", true), ["2"] = User.fromData(2, "Hypno Toad", true), ["3"] = User.fromData(3, "John Zoidberg", false), ["4"] = User.fromData(4, "Pazuzu", true), ["5"] = User.fromData(5, "Ogden Wernstrom", true), ["6"] = User.fromData(6, "Lrrr", true), } it("should do nothing if empty list of users is provided", function() local store = Rodux.Store.new(CustomReducer, {}, { Rodux.thunkMiddleware, }) store:dispatch(UpdateUsers({ })) local state = store:getState() expect(state.UsersReducerMonitor.numberOfAddUsersCalled).to.equal(0) expect(state.FriendCountReducerMonitor.numberOfSetFriendCountCalled).to.equal(0) end) it("should update only the number of users with modified data", function() local store = Rodux.Store.new(CustomReducer, { Users = listOfUsers, }, { Rodux.thunkMiddleware, }) local currentUsers = store:getState().Users local listOfUsersWithPotentialUpdates = { Immutable.Set(currentUsers["2"], "presence", User.PresenceType.IN_GAME), -- changed Immutable.Set(currentUsers["5"], "isFriend", false), -- changed Immutable.Set(currentUsers["6"], "isFriend", true), -- did not change } store:dispatch(UpdateUsers(listOfUsersWithPotentialUpdates)) local state = store:getState() expect(state.UsersReducerMonitor.numberOfAddUsersCalled).to.equal(1) expect(state.UsersReducerMonitor.numberOfUsersPassedIn).to.equal(2) end) it("should correctly update the number of friends", function() local store = Rodux.Store.new(CustomReducer, {}, { Rodux.thunkMiddleware, }) store:dispatch(UpdateUsers(listOfUsers)) local state = store:getState() expect(state.FriendCountReducerMonitor.numberOfSetFriendCountCalled).to.equal(1) expect(state.FriendCount).to.equal(5) local currentUsers = store:getState().Users local listOfUsersWithPotentialUpdates = { Immutable.Set(currentUsers["2"], "presence", User.PresenceType.IN_GAME), -- friendship didn't change Immutable.Set(currentUsers["5"], "isFriend", false), -- friendship changed Immutable.Set(currentUsers["6"], "isFriend", false), -- friendship changed User.fromData(7, "Nibbler", true), -- new friend } store:dispatch(UpdateUsers(listOfUsersWithPotentialUpdates)) state = store:getState() expect(state.FriendCount).to.equal(4) end) end