return function()
    local Action = require(script.Parent.Action)

    it("should return a table", function()
        local action = Action("foo", function()
            return {}
        end)

        expect(action).to.be.a("table")
    end)

    it("should set the name of the action", function()
        local action = Action("foo", function()
            return {}
        end)

        expect(action.name).to.equal("foo")
    end)

    it("should be able to be called as a function", function()
        local action = Action("foo", function()
            return {}
        end)

        expect(action).never.to.throw()
    end)

    it("should return a table when called as a function", function()
        local action = Action("foo", function()
            return {}
        end)

        expect(action()).to.be.a("table")
    end)

    it("should set the type of the action", function()
        local action = Action("foo", function()
            return {}
        end)

        expect(action().type).to.equal("foo")
    end)

    it("should set values", function()
        local action = Action("foo", function(value)
            return {
                value = value
            }
        end)

        expect(action(100).value).to.equal(100)
    end)

    it("should throw when passed a function", function()
        local action = Action("foo", function()
            return function() end
        end)

        expect(action).to.throw()
    end)

    it("should throw with a invalid name", function()
        expect(function()
            Action(nil, function()
                return {}
            end)
        end).to.throw()

        expect(function()
            Action(100, function()
                return {}
            end)
        end).to.throw()
    end)

    it("should throw when passed a invalid function", function()
        expect(function()
            Action("foo", nil)
        end).to.throw()

        expect(function()
            Action("foo", {})
        end).to.throw()
    end)
end