return function()
	local CorePackages = game:GetService("CorePackages")
	local UpdateFetchingStatus = require(CorePackages.AppTempCommon.LuaApp.Actions.UpdateFetchingStatus)
	local FetchingStatusReducer = require(CorePackages.AppTempCommon.LuaApp.Reducers.FetchingStatus)
	local RetrievalStatus = require(CorePackages.AppTempCommon.LuaApp.Enum.RetrievalStatus)
	local TableUtilities = require(CorePackages.AppTempCommon.LuaApp.TableUtilities)

	local KEY_1 = "key_1"
	local KEY_2 = "key_2"

	describe("FetchingStatus", function()
		it("should be empty by default", function()
			local state = FetchingStatusReducer(nil, {})

			expect(TableUtilities.FieldCount(state)).to.equal(0)
		end)

		it("should not be modified by other actions", function()
			local oldState = FetchingStatusReducer(nil, {})
			local newState = FetchingStatusReducer(oldState, { type = "not a real action" })

			expect(newState).to.equal(oldState)
		end)

		it("should be changed using UpdateFetchingStatus", function()
			local state = FetchingStatusReducer(nil, {})

			state = FetchingStatusReducer(state, UpdateFetchingStatus(KEY_1, RetrievalStatus.Fetching))
			expect(state[KEY_1]).to.equal(RetrievalStatus.Fetching)

			state = FetchingStatusReducer(state, UpdateFetchingStatus(KEY_1, RetrievalStatus.Failed))
			expect(state[KEY_1]).to.equal(RetrievalStatus.Failed)
		end)

		it("should store different values for different keys", function()
			local state = FetchingStatusReducer(nil, {})

			state = FetchingStatusReducer(state, UpdateFetchingStatus(KEY_1, RetrievalStatus.Failed))
			state = FetchingStatusReducer(state, UpdateFetchingStatus(KEY_2, RetrievalStatus.Done))

			expect(state[KEY_1]).to.equal(RetrievalStatus.Failed)
			expect(state[KEY_2]).to.equal(RetrievalStatus.Done)
		end)

		it("should clear values for nil keys", function()
			local state = { [KEY_1] = RetrievalStatus.Fetching }

			state = FetchingStatusReducer(state, UpdateFetchingStatus(KEY_1, nil))
			expect(state[KEY_1]).to.equal(nil)
		end)
	end)
end
