Repository: praw-dev/praw

Issue:
Implement endpoints for rule creation. deletion, and modification
**Describe the solution you'd like**

To programmatically define rules for a subreddit, IMO the clearest option is to implement `SubredditWidgetsModeration.add_rules_widget`. [Several related methods](https://praw.readthedocs.io/en/v7.0.0/code_overview/other/subredditwidgetsmoderation.html) are supported, including:
- add_button_widget
- add_calendar
- add_community_list
- add_custom_widget
- add_image_widget
- add_menu
- add_post_flair_widget
- add_text_area 

**Describe alternatives you've considered**

I can use another widget to broadcast rules for a subreddit, but AFAIK only rules defined in the rules widget can be used to report specific rule violations. 

Discussion:
jarhill0: More general comment, now that I've pulled your code and I'm playing around with it: Moderator-only actions should be under some sort of `.mod` namespace. So, 

    reddit.subreddit('NAME').rules['No spam'].mod.delete()

and

    reddit.subreddit('NAME').rules.mod.add("No spam", "all")
PythonCoderAS: So should I make a RuleModeration and SubredditRuleModeration?
jarhill0: > So should I make a RuleModeration and SubredditRuleModeration?

Yep.
jarhill0: Another thing I'd like to see is tests for what happens when invalid indices are used, and when invalid short_name keys are used (should be `IndexError` and `KeyError`, respectively).
jarhill0: See https://github.com/jarhill0/praw/commit/e248bdeb73d6730832c47ede380677b25fcb9d37 for objector support. Because of your point about the subreddit, we need to ensure that anything the objector gives us gets `self.subreddit` set afterwards. I also implemented some of the changes I suggested, like the cached property. 
PythonCoderAS: > Another thing I'd like to see is tests for what happens when invalid indices are used, and when invalid short_name keys are used (should be `IndexError` and `KeyError`, respectively).

Actually, a KeyError won't occur, because objects are lazy loaded. A ClientException will occur though.
jarhill0: 
> Actually, a KeyError won't occur, because objects are lazy loaded. A ClientException will occur though.

I see that, and that's fine. Let's write a test for it though.

PythonCoderAS: I'm merging with your branch.

Patch:
diff --git a/CHANGES.rst b/CHANGES.rst
index be1e431a..87ea66cd 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,11 @@ Change Log
 Unreleased
 ----------
 
+**Added**
+
+* :class:`.Rule` to represent one rule of a subreddit.
+* :class:`.SubredditRules` to get and add rules.
+
 **Fixed**
 
 * An issue where certain subreddit settings could not be set through
@@ -686,7 +691,7 @@ parameter as described below:
 
 **Added**
 
-* :meth:`.Subreddit.rules` to get the rules of a subreddit.
+* ``.Subreddit.rules`` to get the rules of a subreddit.
 * :class:`.LiveContributorRelationship`, which can be obtained through
   :attr:`.LiveThread.contributor`, to interact with live threads'
   contributors.
diff --git a/docs/code_overview/other.rst b/docs/code_overview/other.rst
index f6a6e3e6..1de87135 100644
--- a/docs/code_overview/other.rst
+++ b/docs/code_overview/other.rst
@@ -38,7 +38,9 @@ instances of them bound to an attribute of one of the PRAW models.
 
    other/commentmoderation
    other/submissionmoderation
+   other/rulemoderation
    other/subredditmoderation
+   other/subredditrulesmoderation
    other/subredditwidgetsmoderation
    other/thingmoderationmixin
    other/widgetmoderation
@@ -101,11 +103,13 @@ instances of them bound to an attribute of one of the PRAW models.
    other/redditbase
    other/redditorlist
    other/removalreason
+   other/rule
    other/sublisting
    other/submenu
    other/subredditemoji
    other/subredditmessage
    other/subredditremovalreasons
+   other/subredditrules
    other/redditorstream
    other/trophy
    other/util
diff --git a/docs/code_overview/other/rule.rst b/docs/code_overview/other/rule.rst
new file mode 100644
index 00000000..9667cfdf
--- /dev/null
+++ b/docs/code_overview/other/rule.rst
@@ -0,0 +1,7 @@
+Rule
+====
+
+.. autoclass:: praw.models.Rule
+   :inherited-members:
+
+.. include:: ../models/note_dynamically_provided_attributes.txt
diff --git a/docs/code_overview/other/rulemoderation.rst b/docs/code_overview/other/rulemoderation.rst
new file mode 100644
index 00000000..6d669792
--- /dev/null
+++ b/docs/code_overview/other/rulemoderation.rst
@@ -0,0 +1,5 @@
+RuleModeration
+==============
+
+.. autoclass:: praw.models.reddit.rules.RuleModeration
+   :inherited-members:
diff --git a/docs/code_overview/other/subredditrules.rst b/docs/code_overview/other/subredditrules.rst
new file mode 100644
index 00000000..498741de
--- /dev/null
+++ b/docs/code_overview/other/subredditrules.rst
@@ -0,0 +1,5 @@
+SubredditRules
+==============
+
+.. autoclass:: praw.models.reddit.rules.SubredditRules
+   :inherited-members:
diff --git a/docs/code_overview/other/subredditrulesmoderation.rst b/docs/code_overview/other/subredditrulesmoderation.rst
new file mode 100644
index 00000000..7ff5e751
--- /dev/null
+++ b/docs/code_overview/other/subredditrulesmoderation.rst
@@ -0,0 +1,5 @@
+SubredditRulesModeration
+========================
+
+.. autoclass:: praw.models.reddit.rules.SubredditRulesModeration
+   :inherited-members:
diff --git a/praw/endpoints.py b/praw/endpoints.py
index 60a53f1f..5107c1e9 100644
--- a/praw/endpoints.py
+++ b/praw/endpoints.py
@@ -13,6 +13,7 @@ API_PATH = {
     "about_traffic":           "r/{subreddit}/about/traffic/",
     "about_unmoderated":       "r/{subreddit}/about/unmoderated/",
     "accept_mod_invite":       "r/{subreddit}/api/accept_moderator_invite",
+    "add_subreddit_rule":      "api/add_subreddit_rule",
     "approve":                 "api/approve/",
     "block":                   "api/block",
     "block_user":              "/api/block_user/",
@@ -139,7 +140,9 @@ API_PATH = {
     "removal_reasons":         "api/v1/modactions/removal_reasons",
     "removal_reason":          "api/v1/{subreddit}/removal_reasons/{id}",
     "removal_reasons_list":    "api/v1/{subreddit}/removal_reasons",
+    "remove_subreddit_rule":   "api/remove_subreddit_rule",
     "remove":                  "api/remove/",
+    "reorder_subreddit_rules": "api/reorder_subreddit_rules",
     "report":                  "api/report/",
     "rules":                   "r/{subreddit}/about/rules",
     "save":                    "api/save/",
@@ -189,6 +192,7 @@ API_PATH = {
     "unsave":                  "api/unsave/",
     "unspoiler":               "api/unspoiler/",
     "update_settings":         "api/v1/subreddit/update_settings",
+    "update_subreddit_rule":   "api/update_subreddit_rule",
     "upload_image":            "r/{subreddit}/api/upload_sr_img",
     "user":                    "user/{user}/",
     "user_about":              "user/{user}/about/",
diff --git a/praw/models/__init__.py b/praw/models/__init__.py
index b3e46cdf..8e186429 100644
--- a/praw/models/__init__.py
+++ b/praw/models/__init__.py
@@ -20,6 +20,7 @@ from .reddit.more import MoreComments
 from .reddit.multi import Multireddit
 from .reddit.redditor import Redditor
 from .reddit.removal_reasons import RemovalReason
+from .reddit.rules import Rule
 from .reddit.submission import Submission
 from .reddit.subreddit import Subreddit
 from .reddit.widgets import (
diff --git a/praw/models/reddit/rules.py b/praw/models/reddit/rules.py
new file mode 100644
index 00000000..1ad99703
--- /dev/null
+++ b/praw/models/reddit/rules.py
@@ -0,0 +1,419 @@
+"""Provide the Rule class."""
+from typing import Dict, Iterator, List, Optional, TypeVar, Union, Any
+from urllib.parse import quote
+from warnings import warn
+
+from .base import RedditBase
+from ...const import API_PATH
+from ...exceptions import ClientException
+from ...util.cache import cachedproperty
+
+_RuleModeration = TypeVar("_RuleModeration")
+_SubredditRulesModeration = TypeVar("_SubredditRulesModeration")
+Reddit = TypeVar("Reddit")
+Subreddit = TypeVar("Subreddit")
+
+
+class Rule(RedditBase):
+    """An individual Rule object.
+
+    **Typical Attributes**
+
+    This table describes attributes that typically belong to objects of this
+    class. Since attributes are dynamically provided (see
+    :ref:`determine-available-attributes-of-an-object`), there is not a
+    guarantee that these attributes will always be present, nor is this list
+    necessarily comprehensive.
+
+    ======================= ===================================================
+    Attribute               Description
+    ======================= ===================================================
+    ``created_utc``         Time the rule was created, represented in
+                            `Unix Time`_.
+    ``description``         The description of the rule, if provided, otherwise
+                            a blank string.
+    ``kind``                The kind of rule. Can be ``"link"``, ``comment"``,
+                            or ``"all"``.
+    ``priority``            Represents where the rule is ranked. For example,
+                            the first rule is at priority ``0``. Serves as an
+                            index number on the list of rules.
+    ``short_name``          The name of the rule.
+    ``violation_reason``    The reason that is displayed on the report menu for
+                            the rule.
+    ======================= ===================================================
+
+
+    .. _Unix Time: https://en.wikipedia.org/wiki/Unix_time
+
+    """
+
+    STR_FIELD = "short_name"
+
+    @cachedproperty
+    def mod(self) -> _RuleModeration:
+        """Contain methods used to moderate rules.
+
+        To delete ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+            reddit.subreddit('NAME').rules['No spam'].mod.delete()
+
+        To update ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+            reddit.subreddit("NAME").removal_reasons["No spam"].mod.update(
+                description="Don't do this!",
+                violation_reason="Spam post")
+        """
+        return RuleModeration(self)
+
+    def __init__(
+        self,
+        reddit: Reddit,
+        subreddit: Optional[Subreddit] = None,
+        short_name: Optional[str] = None,
+        _data: Optional[Dict[str, str]] = None,
+    ):
+        """Construct an instance of the Rule object."""
+        if (short_name, _data).count(None) != 1:
+            raise ValueError("Either short_name or _data needs to be given.")
+        self.short_name = short_name
+        # Note: The subreddit parameter can be None, because the objector
+        # does not know this info. In that case, it is the responsibility of
+        # the caller to set the `subreddit` property on the returned value.
+        self.subreddit = subreddit
+        super().__init__(reddit, _data=_data)
+
+    def __getattribute__(self, attribute: str) -> Any:
+        """Get the value of an attribute."""
+        value = super().__getattribute__(attribute)
+        if attribute == "subreddit" and value is None:
+            raise ValueError(
+                "The Rule is missing a subreddit. File a bug report at PRAW."
+            )
+        return value
+
+    def _fetch(self):
+        for rule in self.subreddit.rules:
+            if rule.short_name == self.short_name:
+                self.__dict__.update(rule.__dict__)
+                self._fetched = True
+                return
+        raise ClientException(
+            "Subreddit {} does not have the rule {}".format(
+                self.subreddit, self.short_name
+            )
+        )
+
+
+class SubredditRules:
+    """Provide a set of functions to a Subreddit's rules."""
+
+    @cachedproperty
+    def mod(self) -> _SubredditRulesModeration:
+        """Contain methods to moderate subreddit rules as a whole.
+
+        To add rule ``"No spam"`` to the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+           reddit.subreddit('NAME').rules.mod.add(
+               "No spam",
+               "all",
+               description="Do not spam. Spam bad")
+
+        To move the fourth rule to the first position, and then to move the
+        prior first rule to where the third rule originally was in the
+        subreddit ``"NAME"``:
+
+        .. code-block:: python
+
+            subreddit = reddit.subreddit("NAME")
+            rules = list(subreddit.rules)
+            new_rules = rules[3:4] + rules[1:3] + rules[0:1] + rules[4:]
+            # Alternate: [rules[3]] + rules[1:3] + [rules[0]] + rules[4:]
+            new_rule_list = subreddit.rules.mod.reorder(new_rules)
+
+        """
+        return SubredditRulesModeration(self)
+
+    def __call__(self) -> Iterator:
+        r"""Return a list of :class:`.Rule`\ s (Deprecated)."""
+        warn(
+            "Calling SubredditRules to get a list of rules is deprecated. "
+            "Remove the parentheses to use the iterator.",
+            category=DeprecationWarning,
+            stacklevel=2,
+        )
+        return self.__iter__()
+
+    def __getitem__(self, short_name: Union[str, int, slice]) -> Rule:
+        """Return the Rule for the subreddit with short_name ``short_name``.
+
+        :param short_name: The short_name of the rule, or the rule number.
+
+        .. note:: Rules fetched using a specific rule name are lazy loaded, so
+            you might have to access an attribute to get all of the expected
+            attributes.
+
+        This method is to be used to fetch a specific rule, like so:
+
+        .. code-block:: python
+
+            rule_name = 'No spam'
+            rule = reddit.subreddit('NAME').rules[rule_name]
+            print(rule)
+
+        You can also fetch a numbered rule of a subreddit.
+
+        Rule numbers start at ``0``, so the first rule is at index ``0``, and the
+        second rule is at index ``1``, and so on.
+
+        If a rule of a specific number does not exist, an
+        :py:class:`IndexError` will be thrown.
+
+        .. note:: You can use negative indexes, such as ``-1``, to get the last
+            rule. You can also use slices, to get a subset of rules, such as
+            the last three rules with ``rules[-3:]``.
+
+        For example, to fetch the second rule of ``AskReddit``:
+
+        .. code-block:: python
+
+            rule = reddit.subreddit("AskReddit").rules[1]
+
+        """
+        if not isinstance(short_name, str):
+            return self._rule_list[short_name]
+        return Rule(
+            self._reddit, subreddit=self.subreddit, short_name=short_name
+        )
+
+    def __init__(self, subreddit: Subreddit):
+        """Create a SubredditRules instance.
+
+        :param subreddit: The subreddit whose rules to work with.
+
+        """
+        self.subreddit = subreddit
+        self._reddit = subreddit._reddit
+
+    def __iter__(self) -> Iterator:
+        """Iterate through the rules of the subreddit.
+
+        :returns: An iterator containing all of the rules of a subreddit.
+
+        This method is used to discover all rules for a subreddit:
+
+        .. code-block:: python
+
+           for rule in reddit.subreddit('NAME').rules:
+               print(rule)
+
+        """
+        return iter(self._rule_list)
+
+    @cachedproperty
+    def _rule_list(self) -> List[Rule]:
+        """Get a list of Rule objects.
+
+        :returns: A list of instances of :class:`.Rule`.
+        """
+        rule_list = self._reddit.get(
+            API_PATH["rules"].format(subreddit=self.subreddit)
+        )
+        for rule in rule_list:
+            rule.subreddit = self.subreddit
+        return rule_list
+
+
+class RuleModeration:
+    """Contain methods used to moderate rules.
+
+    To delete ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+    .. code-block:: python
+
+        reddit.subreddit('NAME').rules['No spam'].mod.delete()
+
+    To update ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+    .. code-block:: python
+
+        reddit.subreddit("NAME").removal_reasons["No spam"].mod.update(
+            description="Don't do this!",
+            violation_reason="Spam post")
+    """
+
+    def __init__(self, rule: Rule):
+        """Instantize the RuleModeration class."""
+        self.rule = rule
+
+    def delete(self):
+        """Delete a rule from this subreddit.
+
+        To delete ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+            reddit.subreddit('NAME').rules['No spam'].mod.delete()
+
+        """
+        data = {
+            "r": str(self.rule.subreddit),
+            "short_name": self.rule.short_name,
+        }
+        self.rule._reddit.post(API_PATH["remove_subreddit_rule"], data=data)
+
+    def update(
+        self,
+        description: Optional[str] = None,
+        kind: Optional[str] = None,
+        short_name: Optional[str] = None,
+        violation_reason: Optional[str] = None,
+    ) -> Rule:
+        """Update the rule from this subreddit.
+
+        .. note:: Existing values will be used for any unspecified arguments.
+
+        :param description: The new description for the rule. Can be empty.
+        :param kind: The kind of item that the rule applies to. One of
+            ``"link"``, ``"comment"``, or ``"all"``.
+        :param short_name: The name of the rule.
+        :param violation_reason: The reason that is shown on the report menu.
+
+        To update ``"No spam"`` from the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+            reddit.subreddit("NAME").removal_reasons["No spam"].mod.update(
+                description="Don't do this!",
+                violation_reason="Spam post")
+
+        """
+        data = {
+            "r": str(self.rule.subreddit),
+            "old_short_name": self.rule.short_name,
+        }
+        for name, value in {
+            "description": description,
+            "kind": kind,
+            "short_name": short_name,
+            "violation_reason": violation_reason,
+        }.items():
+            data[name] = getattr(self.rule, name) if value is None else value
+        updated_rule = self.rule._reddit.post(
+            API_PATH["update_subreddit_rule"], data=data
+        )[0]
+        updated_rule.subreddit = self.rule.subreddit
+        return updated_rule
+
+
+class SubredditRulesModeration:
+    """Contain methods to moderate subreddit rules as a whole.
+
+    To add rule ``"No spam"`` to the subreddit ``"NAME"`` try:
+
+    .. code-block:: python
+
+       reddit.subreddit('NAME').rules.mod.add(
+           "No spam",
+           "all",
+           description="Do not spam. Spam bad")
+
+    To move the fourth rule to the first position, and then to move the prior
+    first rule to where the third rule originally was in the subreddit
+    ``"NAME"``:
+
+    .. code-block:: python
+
+        subreddit = reddit.subreddit("NAME")
+        rules = list(subreddit.rules)
+        new_rules = rules[3:4] + rules[1:3] + rules[0:1] + rules[4:]
+        # Alternate: [rules[3]] + rules[1:3] + [rules[0]] + rules[4:]
+        new_rule_list = subreddit.rules.mod.reorder(new_rules)
+
+    """
+
+    def __init__(self, subreddit_rules: SubredditRules):
+        """Instantize the SubredditRulesModeration class."""
+        self.subreddit_rules = subreddit_rules
+
+    def add(
+        self,
+        short_name: str,
+        kind: str,
+        description: str = "",
+        violation_reason: Optional[str] = None,
+    ) -> Rule:
+        """Add a removal reason to this subreddit.
+
+        :param short_name: The name of the rule.
+        :param kind: The kind of item that the rule applies to. One of
+            ``"link"``, ``"comment"``, or ``"all"``.
+        :param description: The description for the rule. Optional.
+        :param violation_reason: The reason that is shown on the report menu.
+            If a violation reason is not specified, the short name will be used
+            as the violation reason.
+        :returns: The Rule added.
+
+        To add rule ``"No spam"`` to the subreddit ``"NAME"`` try:
+
+        .. code-block:: python
+
+           reddit.subreddit('NAME').rules.mod.add(
+               "No spam",
+               "all",
+               description="Do not spam. Spam bad")
+
+        """
+        data = {
+            "r": str(self.subreddit_rules.subreddit),
+            "description": description,
+            "kind": kind,
+            "short_name": short_name,
+            "violation_reason": short_name
+            if violation_reason is None
+            else violation_reason,
+        }
+        new_rule = self.subreddit_rules._reddit.post(
+            API_PATH["add_subreddit_rule"], data=data
+        )[0]
+        new_rule.subreddit = self.subreddit_rules.subreddit
+        return new_rule
+
+    def reorder(self, rule_list: List[Rule]) -> List[Rule]:
+        """Reorder the rules of a subreddit.
+
+        :param rule_list: The list of rules, in the wanted order. Each index of
+            the list indicates the position of the rule.
+        :returns: A list containing the rules in the specified order.
+
+        For example, to move the fourth rule to the first position, and then to
+        move the prior first rule to where the third rule originally was in the
+        subreddit ``"NAME"``:
+
+        .. code-block:: python
+
+            subreddit = reddit.subreddit("NAME")
+            rules = list(subreddit.rules)
+            new_rules = rules[3:4] + rules[1:3] + rules[0:1] + rules[4:]
+            # Alternate: [rules[3]] + rules[1:3] + [rules[0]] + rules[4:]
+            new_rule_list = subreddit.rules.mod.reorder(new_rules)
+
+        """
+        order_string = quote(
+            ",".join([str(item) for item in rule_list]), safe=","
+        )
+        data = {
+            "r": str(self.subreddit_rules.subreddit),
+            "new_rule_order": order_string,
+        }
+        response = self.subreddit_rules._reddit.post(
+            API_PATH["reorder_subreddit_rules"], data=data
+        )
+        for rule in response:
+            rule.subreddit = self.subreddit_rules.subreddit
+        return response
diff --git a/praw/models/reddit/subreddit.py b/praw/models/reddit/subreddit.py
index 2739e094..df277331 100644
--- a/praw/models/reddit/subreddit.py
+++ b/praw/models/reddit/subreddit.py
@@ -29,6 +29,7 @@ from .base import RedditBase
 from .emoji import SubredditEmoji
 from .mixins import FullnameMixin, MessageableMixin
 from .modmail import ModmailConversation
+from .rules import SubredditRules
 from .removal_reasons import SubredditRemovalReasons
 from .widgets import SubredditWidgets, WidgetEncoder
 from .wikipage import WikiPage
@@ -404,6 +405,31 @@ class Subreddit(
         """
         return SubredditQuarantine(self)
 
+    @cachedproperty
+    def rules(self):
+        """Provide an instance of :class:`.SubredditRules`.
+
+        Use this attribute for interacting with a subreddit's rules.
+        For example, to list all the rules for a subreddit:
+
+        .. code-block:: python
+
+            for rule in reddit.subreddit('AskReddit').rules:
+                print(rule)
+
+        You can also add rules to the subreddit, if you are a moderator. For
+        example, to make a rule called ``"No spam"`` in the subreddit ``"NAME"``:
+
+        .. code-block:: python
+
+           reddit.subreddit('NAME').rules.mod.add(
+               "No spam",
+               "all",
+               description="Do not spam. Spam bad")
+
+        """
+        return SubredditRules(self)
+
     @cachedproperty
     def stream(self):
         """Provide an instance of :class:`.SubredditStream`.
@@ -702,18 +728,6 @@ class Subreddit(
         except ClientException:
             return None
 
-    def rules(self):
-        """Return rules for the subreddit.
-
-        For example to show the rules of ``r/redditdev`` try:
-
-        .. code-block:: python
-
-           reddit.subreddit('redditdev').rules()
-
-        """
-        return self._reddit.get(API_PATH["rules"].format(subreddit=self))
-
     def search(
         self,
         query,
diff --git a/praw/objector.py b/praw/objector.py
index 746dee97..f1b9cc60 100644
--- a/praw/objector.py
+++ b/praw/objector.py
@@ -1,5 +1,6 @@
 """Provides the Objector class."""
 
+from json import loads
 from typing import Any, Dict, List, Optional, TypeVar, Union
 
 from .exceptions import ClientException, RedditAPIException
@@ -72,6 +73,9 @@ class Objector:
             # Modmail message
             data = snake_case_keys(data)
             parser = self.parsers["ModmailMessage"]
+        elif {"kind", "short_name", "violation_reason"}.issubset(data):
+            # This is a Rule
+            parser = self.parsers["rule"]
         elif {"isAdmin", "isDeleted"}.issubset(data):
             # Modmail author
             data = snake_case_keys(data)
@@ -151,6 +155,8 @@ class Objector:
                 return data
             if "things" in data["json"]["data"]:  # Submission.reply
                 return self.objectify(data["json"]["data"]["things"])
+            if "rules" in data["json"]["data"]:
+                return self.objectify(loads(data["json"]["data"]["rules"]))
             if "url" in data["json"]["data"]:  # Subreddit.submit
                 # The URL is the URL to the submission, so it's removed.
                 del data["json"]["data"]["url"]
@@ -158,6 +164,8 @@ class Objector:
             else:
                 parser = self.parsers["LiveUpdateEvent"]
             return parser.parse(data["json"]["data"], self._reddit)
+        if "rules" in data:
+            return self.objectify(data["rules"])
         if "json" in data and "errors" in data["json"]:
             errors = data["json"]["errors"]
             if len(errors) > 0:
diff --git a/praw/reddit.py b/praw/reddit.py
index 4481149f..664382df 100644
--- a/praw/reddit.py
+++ b/praw/reddit.py
@@ -395,6 +395,7 @@ class Reddit:
             "moderators": models.ModeratorsWidget,
             "more": models.MoreComments,
             "post-flair": models.PostFlairWidget,
+            "rule": models.Rule,
             "stylesheet": models.Stylesheet,
             "subreddit-rules": models.RulesWidget,
             "textarea": models.TextArea,


Test patch:
diff --git a/tests/integration/cassettes/TestRule.test_add_rule.json b/tests/integration/cassettes/TestRule.test_add_rule.json
new file mode 100644
index 00000000..9988d135
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_add_rule.json
@@ -0,0 +1,225 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T03:37:45",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:45 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=hn35ltS99Y72uWlNty; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21932-LGA"
+          ],
+          "X-Timer": [
+            "S1587958665.436433,VS0,VE359"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T03:37:46",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&description=Test+by+PRAW&kind=all&r=<TEST_SUBREDDIT>&short_name=PRAW+Test&violation_reason=PTest"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "109"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "edgebucket=hn35ltS99Y72uWlNty"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/add_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"Test by PRAW\\\", \\\"short_name\\\": \\\"PRAW Test\\\", \\\"violation_reason\\\": \\\"PTest\\\", \\\"created_utc\\\": 1587987466.0, \\\"priority\\\": 4, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003ETest by PRAW\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}]\", \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003ETest by PRAW\\u003C/p\\u003E\\n\\u003C!-- SC_ON --\\u003E\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "448"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:46 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21937-LGA"
+          ],
+          "X-Timer": [
+            "S1587958666.929753,VS0,VE205"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=iFGJPbrDsycggJmFfl.0.1587958665967.Z0FBQUFBQmVwbE9LNC1SanVKTkYyZER0LUhINVhqUWg0a2VkTnZJSGE4TFZ3ZDJtUlNaVlBKOW4xcnhONjc0Ujd5T0lJQ0laMFluaEthUVQzR1ljQUR3M0xCSlhtSW5mU2sxNzZhenJJTXUyZktGMXF1SGJCcmNfMFNJRXY2Um1RN1NlRmgwcFRYSjg; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 05:37:46 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "599.0"
+          ],
+          "x-ratelimit-reset": [
+            "135"
+          ],
+          "x-ratelimit-used": [
+            "1"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/add_subreddit_rule?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_add_rule_without_violation_reason.json b/tests/integration/cassettes/TestRule.test_add_rule_without_violation_reason.json
new file mode 100644
index 00000000..4097bd63
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_add_rule_without_violation_reason.json
@@ -0,0 +1,225 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T03:37:46",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:46 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=I4EuIaxCi03wmN0cZ3; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21972-LGA"
+          ],
+          "X-Timer": [
+            "S1587958666.244146,VS0,VE286"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T03:37:46",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&description=&kind=comment&r=<TEST_SUBREDDIT>&short_name=PRAW+Test+2&violation_reason=PRAW+Test+2"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "109"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "edgebucket=I4EuIaxCi03wmN0cZ3"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/add_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"\\\", \\\"short_name\\\": \\\"PRAW Test 2\\\", \\\"violation_reason\\\": \\\"PRAW Test 2\\\", \\\"created_utc\\\": 1587987466.0, \\\"priority\\\": 5, \\\"description_html\\\": null}]\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "243"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:46 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21958-LGA"
+          ],
+          "X-Timer": [
+            "S1587958667.630161,VS0,VE223"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=MFs1vxfp9XxcFEjUo9.0.1587958666719.Z0FBQUFBQmVwbE9LeHA2VldhZWJ0alc4T0t3NUdIbl9YVXUwanZEUUphY2hZVXNZa3NaeWRjU3pjTkM2YnRXaHJSdjd3c21TS3lwX0kzRUx3LVFLWV82eUk1RFJ2SmtEbXF3S2N3RndiMEdpRDUzQjJ0eXN4OFd2RGhrUkx6eUM0NGhKaU5HMW9aQ0o; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 05:37:46 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "598.0"
+          ],
+          "x-ratelimit-reset": [
+            "134"
+          ],
+          "x-ratelimit-used": [
+            "2"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/add_subreddit_rule?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_delete_rule.json b/tests/integration/cassettes/TestRule.test_delete_rule.json
new file mode 100644
index 00000000..330d9a08
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_delete_rule.json
@@ -0,0 +1,461 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-28T03:15:06",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:15:06 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=kyBI9aiZXIHSnXzuRJ; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21966-LGA"
+          ],
+          "X-Timer": [
+            "S1588043707.519199,VS0,VE288"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:15:07",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=kyBI9aiZXIHSnXzuRJ"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 2}, {\"kind\": \"all\", \"description\": \"sdafdsafsdf\", \"short_name\": \"asdfasfsdaf\", \"violation_reason\": \"sdafdsaf\", \"created_utc\": 1588072423.0, \"priority\": 3, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsdfsaf\", \"short_name\": \"asdfdasfsa\", \"violation_reason\": \"asdfdasfsa\", \"created_utc\": 1588072426.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsafsafd\", \"short_name\": \"asfasfsd\", \"violation_reason\": \"asfasfsd\", \"created_utc\": 1588072430.0, \"priority\": 5, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsafsafd\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5668"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:15:07 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=XaBWlwjTJf0yZ6t7c5.0.1588043707106.Z0FBQUFBQmVwNS03UVdRZmZETFBIb1FHczRqWjR4OU1aVzdSTWRfcGRHbjdPOTgzUUtjVjdWTWRYazB4Wm9KUXdnQzA1X0pFUFJYX0lTYXFNMzZfbUdjVUVHNWpISDZZZ251elFZQkZ4WmlCaHdvTFJXdnNFaEVmYnlUMnJBaGNRejd4WE5na1JjWEc; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:15:07 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21947-LGA"
+          ],
+          "X-Timer": [
+            "S1588043707.063641,VS0,VE89"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "599.0"
+          ],
+          "x-ratelimit-reset": [
+            "293"
+          ],
+          "x-ratelimit-used": [
+            "1"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:15:07",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&r=<TEST_SUBREDDIT>&short_name=asfasfsd"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "51"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=kyBI9aiZXIHSnXzuRJ; session_tracker=XaBWlwjTJf0yZ6t7c5.0.1588043707106.Z0FBQUFBQmVwNS03UVdRZmZETFBIb1FHczRqWjR4OU1aVzdSTWRfcGRHbjdPOTgzUUtjVjdWTWRYazB4Wm9KUXdnQzA1X0pFUFJYX0lTYXFNMzZfbUdjVUVHNWpISDZZZ251elFZQkZ4WmlCaHdvTFJXdnNFaEVmYnlUMnJBaGNRejd4WE5na1JjWEc"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/remove_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"testing post rf\\\", \\\"short_name\\\": \\\"Test post 12\\\", \\\"violation_reason\\\": \\\"34\\\", \\\"created_utc\\\": 1587949210.0, \\\"priority\\\": 0, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"link\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"tesy all\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587969502.0, \\\"priority\\\": 1, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"\\\", \\\"short_name\\\": \\\"sdf\\\", \\\"violation_reason\\\": \\\"sdf\\\", \\\"created_utc\\\": 1587984896.0, \\\"priority\\\": 2, \\\"description_html\\\": null}, {\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"sdafdsafsdf\\\", \\\"short_name\\\": \\\"asdfasfsdaf\\\", \\\"violation_reason\\\": \\\"sdafdsaf\\\", \\\"created_utc\\\": 1588072423.0, \\\"priority\\\": 3, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"fsdfsaf\\\", \\\"short_name\\\": \\\"asdfdasfsa\\\", \\\"created_utc\\\": 1588072426.0, \\\"priority\\\": 4, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}]\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "1344"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:15:07 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21947-LGA"
+          ],
+          "X-Timer": [
+            "S1588043707.212588,VS0,VE169"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=XaBWlwjTJf0yZ6t7c5.0.1588043707255.Z0FBQUFBQmVwNS03dm9tN3NCOV9TNUtVbGVOdUkzRy0yWkZnclBVZTJybWVQaWt6NXl5VlljT3UxSlJPWHc1UXI2bHluMmlIaE9McGVPaXB4ZmtHTTFVMXNFR3lRLWd2b0RGeVp6S25XN2txYTFQM3lSSkNxdVFXZlQ2NkNQQmZ6aUNYUUdRdzdrZEQ; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:15:07 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "598.0"
+          ],
+          "x-ratelimit-reset": [
+            "293"
+          ],
+          "x-ratelimit-used": [
+            "2"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/remove_subreddit_rule?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:15:07",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=kyBI9aiZXIHSnXzuRJ; session_tracker=XaBWlwjTJf0yZ6t7c5.0.1588043707255.Z0FBQUFBQmVwNS03dm9tN3NCOV9TNUtVbGVOdUkzRy0yWkZnclBVZTJybWVQaWt6NXl5VlljT3UxSlJPWHc1UXI2bHluMmlIaE9McGVPaXB4ZmtHTTFVMXNFR3lRLWd2b0RGeVp6S25XN2txYTFQM3lSSkNxdVFXZlQ2NkNQQmZ6aUNYUUdRdzdrZEQ"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 2}, {\"kind\": \"all\", \"description\": \"sdafdsafsdf\", \"short_name\": \"asdfasfsdaf\", \"violation_reason\": \"sdafdsaf\", \"created_utc\": 1588072423.0, \"priority\": 3, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsdfsaf\", \"short_name\": \"asdfdasfsa\", \"violation_reason\": \"asdfdasfsa\", \"created_utc\": 1588072426.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5368"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:15:07 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=XaBWlwjTJf0yZ6t7c5.0.1588043707444.Z0FBQUFBQmVwNS03MEszQjdsV0IybVFjVGdIYTF2WTM2Zk1na214eWc2bWdqeGs0WnZIemwwUmNGdWhoaHd1R0x4bmI2dEpMNVlXQ3pUb0FBVW1YRjJnRUplUGNWZDgxelFiVGE1RWRUNFA3SzdUb3lxZWtMX3AxV3NsYVNmQWZlUXBvanNDZDZpMWo; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:15:07 GMT; secure; SameSite=None; Secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21947-LGA"
+          ],
+          "X-Timer": [
+            "S1588043707.407246,VS0,VE138"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "597.0"
+          ],
+          "x-ratelimit-reset": [
+            "293"
+          ],
+          "x-ratelimit-used": [
+            "3"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_iter_rules.json b/tests/integration/cassettes/TestRule.test_iter_rules.json
new file mode 100644
index 00000000..9d21e915
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_iter_rules.json
@@ -0,0 +1,221 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T03:37:47",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=client_credentials"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "29"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "106"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:47 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=mfWf1nYKOrqObna5aT; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21929-LGA"
+          ],
+          "X-Timer": [
+            "S1587958667.962784,VS0,VE39"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-reddit-loid": [
+            "00000000006be0sfr5.2.1587958666988.Z0FBQUFBQmVwbE9LcTlWME5BcFVJamo0Z2NFWjRHRDVpVHJxQkNkeV9vbXNidW1tc2sxVTdwbC1HMDc5UFMwZ0o5c3poRkFqXzdHTTlIT1FEVU5VYmY1bldpM0pnR1hjUE1zSGdLWG5ObTB3QXRQUC02c21DZWg5T09VTHhfelJ0X3F4VjdkQjQzZV8"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T03:37:47",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=mfWf1nYKOrqObna5aT"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"all\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"r\", \"short_name\": \"Test comment\", \"violation_reason\": \"Comment test\", \"created_utc\": 1587949225.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Er\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"d\", \"short_name\": \"tesy all\", \"violation_reason\": \"df\", \"created_utc\": 1587969502.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Ed\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}, {\"kind\": \"all\", \"description\": \"Test by PRAW\", \"short_name\": \"PRAW Test\", \"violation_reason\": \"PTest\", \"created_utc\": 1587987466.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003ETest by PRAW\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"\", \"short_name\": \"PRAW Test 2\", \"violation_reason\": \"PRAW Test 2\", \"created_utc\": 1587987466.0, \"priority\": 5}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"complaintButtonText\": \"Visit Help Center\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=SELF_HARM\", \"complaintPageTitle\": \"Reporting and responding to people considering suicide or serious self-harm\", \"reasonText\": \"Someone is considering suicide or serious self-harm\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm\", \"fileComplaint\": true, \"complaintPrompt\": \"If someone is considering suicide, showing kindness and understanding can go a long way. If they're inside the U.S., let them know that you care and encourage them to text \\\"CHAT\\\" to 741741. They'll be connected to a trained Crisis Counselor from Crisis Text Line. For more information, including resources available for people outside the U.S., visit our help center.\"}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "6031"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 03:37:47 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "loid=00000000006be0sfr5.2.1587958666988.Z0FBQUFBQmVwbE9MME1reGpfR3RrRlU2NVdNclByTFZnQXNBeXktRGxocDRCTURvLVhRQnM0VV9zVWplS1VGVDc4bUtVZFA4cVZLcXRGYTYteGxLc1gxUFFfMUtfMXRhX3JOTnotZ0lxZElFdE15WjlRWVdSVFVQSDZnMzhPeFRCa0VvZnJfQnFDVjE; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Wed, 27-Apr-2022 03:37:47 GMT; secure; SameSite=None; Secure",
+            "session_tracker=SIFMFUpCSXzwpHY3g4.0.1587958667153.Z0FBQUFBQmVwbE9MZzJoY2RCSUlLczZFVDZOMEktSzh0MXlMRGM1MDdXU0hSRUF2anRNcmthbGNKWWNVSmdjSHZleUZkUzRMaldTdmRFNy1fYjRrVlFYWXFYTlZ1N3pyNzNnMW1kcUhhRktLYzBPZkpsU1phemJtY3NlcmZId3NEeDI2bnlkbWx5V1I; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 05:37:47 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21980-LGA"
+          ],
+          "X-Timer": [
+            "S1587958667.113911,VS0,VE59"
+          ],
+          "access-control-allow-origin": [
+            "*"
+          ],
+          "access-control-expose-headers": [
+            "X-Moose"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_reorder_rules.json b/tests/integration/cassettes/TestRule.test_reorder_rules.json
new file mode 100644
index 00000000..136816fe
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_reorder_rules.json
@@ -0,0 +1,461 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T04:25:10",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:10 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=QqiFcvKsoQeGZaI1MQ; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21959-LGA"
+          ],
+          "X-Timer": [
+            "S1587961510.717385,VS0,VE306"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:25:10",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=QqiFcvKsoQeGZaI1MQ"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587949225.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5071"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:10 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=q6owlAY1eW2kWVET9c.0.1587961510214.Z0FBQUFBQmVwbDZtbkRWNnhOdDVBLXJGOHNuOVlMUjVqUGhNekhzVEF0b2JVcVBSN21HengxWThmaHVPQTJkc1ZpbURSVkNoYVNEaW95eE1GZXEzVDczaUY5MEFkSUVmLVd1R3Q4T0NZQng5cFdJd0J3eUxaalZMZHo4OXN0UlNPUTNsbHl0NUJxQm0; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:25:10 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21946-LGA"
+          ],
+          "X-Timer": [
+            "S1587961510.167380,VS0,VE102"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "595.0"
+          ],
+          "x-ratelimit-reset": [
+            "290"
+          ],
+          "x-ratelimit-used": [
+            "5"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:25:10",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&new_rule_order=Test%2520post%252012%2Ctesy%2520all%2CPRAW%2520Update%2Csdf&r=<TEST_SUBREDDIT>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "106"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=QqiFcvKsoQeGZaI1MQ; session_tracker=q6owlAY1eW2kWVET9c.0.1587961510214.Z0FBQUFBQmVwbDZtbkRWNnhOdDVBLXJGOHNuOVlMUjVqUGhNekhzVEF0b2JVcVBSN21HengxWThmaHVPQTJkc1ZpbURSVkNoYVNEaW95eE1GZXEzVDczaUY5MEFkSUVmLVd1R3Q4T0NZQng5cFdJd0J3eUxaalZMZHo4OXN0UlNPUTNsbHl0NUJxQm0"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"testing post rf\\\", \\\"short_name\\\": \\\"Test post 12\\\", \\\"violation_reason\\\": \\\"34\\\", \\\"created_utc\\\": 1587949210.0, \\\"priority\\\": 0, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"link\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"tesy all\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587969502.0, \\\"priority\\\": 1, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"PRAW Update\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587949225.0, \\\"priority\\\": 2, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"\\\", \\\"short_name\\\": \\\"sdf\\\", \\\"violation_reason\\\": \\\"sdf\\\", \\\"created_utc\\\": 1587984896.0, \\\"priority\\\": 3, \\\"description_html\\\": null}]\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "1104"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:10 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21946-LGA"
+          ],
+          "X-Timer": [
+            "S1587961510.300418,VS0,VE144"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=q6owlAY1eW2kWVET9c.0.1587961510345.Z0FBQUFBQmVwbDZteUtMZzNwbld3aXZ5UGcycHhNYURvUEEwWldob2VIOURQSmxKRDZUTlA1T2p2NkthY0pGTF9aRS13STh6cFExNUUxOExDN1QtbnJveGJYblV3Ukctd0gtUmh0WHJBYWl5b3BmRDUzMU9JNG9WMHRUWjY3cmZGU0FwZ3VWeFVfcjY; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:25:10 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "594.0"
+          ],
+          "x-ratelimit-reset": [
+            "290"
+          ],
+          "x-ratelimit-used": [
+            "6"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:25:10",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=QqiFcvKsoQeGZaI1MQ; session_tracker=q6owlAY1eW2kWVET9c.0.1587961510345.Z0FBQUFBQmVwbDZteUtMZzNwbld3aXZ5UGcycHhNYURvUEEwWldob2VIOURQSmxKRDZUTlA1T2p2NkthY0pGTF9aRS13STh6cFExNUUxOExDN1QtbnJveGJYblV3Ukctd0gtUmh0WHJBYWl5b3BmRDUzMU9JNG9WMHRUWjY3cmZGU0FwZ3VWeFVfcjY"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587949225.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5071"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:10 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=q6owlAY1eW2kWVET9c.0.1587961510495.Z0FBQUFBQmVwbDZtazhDRWVCWGVEM0swQzdLZjR2di04N2JKY0RUa0pvTVBvYmFsSFEyR3pkTG1UUWhvT01PbnNpNVhlcG9adGZzV2dMZVNNOXJMUzQxOVROdzRHY1ZESkdRR1hkVWJHc1Y5MUdGam44MnZ2cWVnc2I3VW9PTFU2Y0MzZ0lycFFib0g; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:25:10 GMT; secure; SameSite=None; Secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21946-LGA"
+          ],
+          "X-Timer": [
+            "S1587961510.468550,VS0,VE83"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "593.0"
+          ],
+          "x-ratelimit-reset": [
+            "290"
+          ],
+          "x-ratelimit-used": [
+            "7"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_reorder_rules_double.json b/tests/integration/cassettes/TestRule.test_reorder_rules_double.json
new file mode 100644
index 00000000..c5f0b706
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_reorder_rules_double.json
@@ -0,0 +1,344 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-28T03:17:16",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:16 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=lgiuXfhVEFnVUthBuA; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21976-LGA"
+          ],
+          "X-Timer": [
+            "S1588043836.115018,VS0,VE303"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:17:18",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=lgiuXfhVEFnVUthBuA"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 1}, {\"kind\": \"all\", \"description\": \"sdafdsafsdf\", \"short_name\": \"asdfasfsdaf\", \"violation_reason\": \"sdafdsaf\", \"created_utc\": 1588072423.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsdfsaf\", \"short_name\": \"asdfdasfsa\", \"violation_reason\": \"asdfdasfsa\", \"created_utc\": 1588072426.0, \"priority\": 3, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"ghfghgf\", \"short_name\": \"dfghfgdhfg\", \"violation_reason\": \"fgdhfdghf\", \"created_utc\": 1588072572.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Eghfghgf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5361"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:18 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=UTIO9S0LiVTLg4TikO.0.1588043838011.Z0FBQUFBQmVwNkEtOXhPbkpUSGZqeGVUTkUxYlNLdnVVamkxZ0tKSS1yUXJ4Y0ItdVA1QWJuV1YzcnRNOEd4bXgtdGVreTdtWV82bDVMX3B5N2lwWnh1eWNTd1FNNHJEN25FTXp3ckNWSUNKTV8xQ0d3cVp1TV9yWldCZUQxSmxVRE01VnVNN3JQcUg; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:18 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21947-LGA"
+          ],
+          "X-Timer": [
+            "S1588043838.898771,VS0,VE161"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "594.0"
+          ],
+          "x-ratelimit-reset": [
+            "162"
+          ],
+          "x-ratelimit-used": [
+            "6"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:17:18",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&new_rule_order=Test%2520post%252012%2Csdf%2Casdfasfsdaf%2Casdfdasfsa%2Cdfghfgdhfg%2CTest%2520post%252012&r=<TEST_SUBREDDIT>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "136"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=lgiuXfhVEFnVUthBuA; session_tracker=UTIO9S0LiVTLg4TikO.0.1588043838011.Z0FBQUFBQmVwNkEtOXhPbkpUSGZqeGVUTkUxYlNLdnVVamkxZ0tKSS1yUXJ4Y0ItdVA1QWJuV1YzcnRNOEd4bXgtdGVreTdtWV82bDVMX3B5N2lwWnh1eWNTd1FNNHJEN25FTXp3ckNWSUNKTV8xQ0d3cVp1TV9yWldCZUQxSmxVRE01VnVNN3JQcUg"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"explanation\": \"Rule ordering has 1 or more rules than subreddit's rules\", \"message\": \"Bad Request\", \"reason\": \"SR_RULE_EXTRA_IN_ORDER\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "137"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:18 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21947-LGA"
+          ],
+          "X-Timer": [
+            "S1588043838.244540,VS0,VE94"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=UTIO9S0LiVTLg4TikO.0.1588043838284.Z0FBQUFBQmVwNkEtSDN5Q2w0VFJhZHhiWE9JUXpDbzJwMFY5T3hmc3o5TmMxZ21ZUTZRenV6UjBvRTJibFZaaGMwbUw4RkZqZmVKTVFBUldKamhwYUJ4SF8zdWptZlZqVmV4OGdfOEMzMzBvQTd6ckFVYU9LZGkzWEYwTWlEMlRmN3hWZ0t3cGpOMW8; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:18 GMT; secure",
+            "loid=00000000006boooz3g.2.1588043838330.Z0FBQUFBQmVwNkEtd3VJc2ZqTEpGc0dBRGRaVDdLMFBhVENrYksxVDVRckRBOUdUMkZxTENxR1lOWFV1NzVIQ1RPN2Z3Qk5BUFNDaVVnaW9NSGl6YkF2ZjlrczZiWUdsUE9mdGRtNDAzUDB4NUJBSXRBejVKanF3NFNmTWRjNEhEeGJHaW9KcXlTZXQ; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Thu, 28-Apr-2022 03:17:18 GMT; secure",
+            "session_tracker=UTIO9S0LiVTLg4TikO.0.1588043838330.Z0FBQUFBQmVwNkEtWDl1dnBTdWhWUE9xaUE5SDJseUN1Mi1rWnFGUk42SnBjeVZoaGdCZndwNkkyV1Z6RmdtcVQ1U1Y2X0NHNXlhVDVaMmZlN0tJQzJWakx1ZE1tZ0FUZE01ZS1SMUpWZjhTREFQNXVwQjF3ZlUwR1pndkp5U1dZbGs2Z0F4a1hva2I; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:18 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "593.0"
+          ],
+          "x-ratelimit-reset": [
+            "162"
+          ],
+          "x-ratelimit-used": [
+            "7"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 400,
+          "message": "Bad Request"
+        },
+        "url": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_reorder_rules_empty.json b/tests/integration/cassettes/TestRule.test_reorder_rules_empty.json
new file mode 100644
index 00000000..2933f73b
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_reorder_rules_empty.json
@@ -0,0 +1,227 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-28T03:08:53",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:08:53 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=0p9aT4YjkQcJ1semev; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21928-LGA"
+          ],
+          "X-Timer": [
+            "S1588043333.795141,VS0,VE313"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:08:54",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&new_rule_order=&r=<TEST_SUBREDDIT>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "47"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "edgebucket=0p9aT4YjkQcJ1semev"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"explanation\": \"Rule ordering doesn't account for 1 or more rules in             subreddit's rules\", \"message\": \"Bad Request\", \"reason\": \"SR_RULE_MISSING_FROM_ORDER\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "167"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:08:54 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21963-LGA"
+          ],
+          "X-Timer": [
+            "S1588043334.965613,VS0,VE94"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=ucqZF5TPbxf0ZMQoOQ.0.1588043334006.Z0FBQUFBQmVwNTVHcXlhTnVBZXNRT19SemdNQm1IT3RNZDhLa0tSZmxkY2JlQWpxZnlVT2RQdm9PNUJWNlBEZDZOcjdpQXVQVFVMdG9zbmdSc3BuaEM4UE54OVlnaUl2RDBrTnZIcVZNenpUSWlnaFo1MzZWRnJmV2QzcEVtNms5YXZGc0k0MFNFY1c; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:08:54 GMT; secure",
+            "loid=00000000006bomh5uw.2.1588043334044.Z0FBQUFBQmVwNTVHYWhGR2ItWjFaUTljV016V1NReENBRTNadV85SnF6cGphd0xvbmRNWlBDLUc3N2EyYmJDSk9tNXA4NG5CTHd4Z1ZjQXhZRFJUVU1LNXVJY2hGQm93d3ozdkhfcklYUTBKcVN2ZkFyaG8zaFUxbHBtOFEtdk1IZEszUHFfRVNBblo; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Thu, 28-Apr-2022 03:08:54 GMT; secure",
+            "session_tracker=6JBZOi1ZPq7dcbPI3D.0.1588043334045.Z0FBQUFBQmVwNTVHNVIxQWJrbWphbzZhZm4wTjd2elNOeEtCX3RReEhhQ2oydW80QnB6bzNmeW1udkNxaHBUMDg2dDZ0bHc4bVcwWV9OVnZjLVRRQnA5c1hlZUVyUUREZE9xTWdWTGdjaXR4RHBIRlFyblhQYUFtOUQ3c1V5Y09ZOXpoVWRLcDlEOFo; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:08:54 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "598.0"
+          ],
+          "x-ratelimit-reset": [
+            "66"
+          ],
+          "x-ratelimit-used": [
+            "2"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 400,
+          "message": "Bad Request"
+        },
+        "url": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_reorder_rules_no_reorder.json b/tests/integration/cassettes/TestRule.test_reorder_rules_no_reorder.json
new file mode 100644
index 00000000..47d7928b
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_reorder_rules_no_reorder.json
@@ -0,0 +1,345 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T04:25:10",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:10 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=bEk9OHAILtudEDcTXz; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21977-LGA"
+          ],
+          "X-Timer": [
+            "S1587961511.685435,VS0,VE291"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:25:11",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=bEk9OHAILtudEDcTXz"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587949225.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5071"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:11 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=VvVbd3zNJbpMAfwAcA.0.1587961511136.Z0FBQUFBQmVwbDZuSV9Nb0NxQTNsUFJoZTRzRUp0NElvWS1lSFdoY0ZkSWk3Ty1CdVJpUlpWa3lHOWF2dWpmdG9vS0RuTWJjQkt5YWh4a2R2ZzJpRnQwVjBsdC1iYmppT2ZiWkNOT0lTMnA2bEhqekVlY2p3Tk5TVW1IMDBiSFNsd2NYUTBTellYel8; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:25:11 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21965-LGA"
+          ],
+          "X-Timer": [
+            "S1587961511.092552,VS0,VE100"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "592.0"
+          ],
+          "x-ratelimit-reset": [
+            "289"
+          ],
+          "x-ratelimit-used": [
+            "8"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:25:11",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&new_rule_order=Test%2520post%252012%2Ctesy%2520all%2CPRAW%2520Update%2Csdf&r=<TEST_SUBREDDIT>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "106"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=bEk9OHAILtudEDcTXz; session_tracker=VvVbd3zNJbpMAfwAcA.0.1587961511136.Z0FBQUFBQmVwbDZuSV9Nb0NxQTNsUFJoZTRzRUp0NElvWS1lSFdoY0ZkSWk3Ty1CdVJpUlpWa3lHOWF2dWpmdG9vS0RuTWJjQkt5YWh4a2R2ZzJpRnQwVjBsdC1iYmppT2ZiWkNOT0lTMnA2bEhqekVlY2p3Tk5TVW1IMDBiSFNsd2NYUTBTellYel8"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"testing post rf\\\", \\\"short_name\\\": \\\"Test post 12\\\", \\\"violation_reason\\\": \\\"34\\\", \\\"created_utc\\\": 1587949210.0, \\\"priority\\\": 0, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"link\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"tesy all\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587969502.0, \\\"priority\\\": 1, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"PRAW Update\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587949225.0, \\\"priority\\\": 2, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}, {\\\"kind\\\": \\\"all\\\", \\\"description\\\": \\\"\\\", \\\"short_name\\\": \\\"sdf\\\", \\\"violation_reason\\\": \\\"sdf\\\", \\\"created_utc\\\": 1587984896.0, \\\"priority\\\": 3, \\\"description_html\\\": null}]\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "1104"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:25:11 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21965-LGA"
+          ],
+          "X-Timer": [
+            "S1587961511.222734,VS0,VE129"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=VvVbd3zNJbpMAfwAcA.0.1587961511271.Z0FBQUFBQmVwbDZuTG5OSnBpaTdhdnF2VUotN0R6U2xONzhQaGZGV2VwOHhqTldaS25JVVFWQVhiQkI5YTRxaGljQkVJbW9jcGRhZjN5RVFUclRJNU44LVY3Wlp2Znd5S0VTZ2c0MU44TXhINFlfUDVCMmNWZmx0bGxocW8tc2JLWEotNTJwdl9zd3k; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:25:11 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "591.0"
+          ],
+          "x-ratelimit-reset": [
+            "289"
+          ],
+          "x-ratelimit-used": [
+            "9"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_reorder_rules_omit.json b/tests/integration/cassettes/TestRule.test_reorder_rules_omit.json
new file mode 100644
index 00000000..f56f0875
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_reorder_rules_omit.json
@@ -0,0 +1,344 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-28T03:08:54",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:08:54 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=HY2KNCAqs99FB5pXQu; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21939-LGA"
+          ],
+          "X-Timer": [
+            "S1588043334.239744,VS0,VE285"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:08:54",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=HY2KNCAqs99FB5pXQu"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587949225.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5071"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:08:54 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=ZgMW4PeBhRKLF3BWlL.0.1588043334687.Z0FBQUFBQmVwNTVHNFcxZVdVOHF1aE0yYzNSWXEtVklva0RXRjM3VnQ1Ty1iQVNHWTRUUFByUVY1RWlQTmk1a1lqUU04eWFaOFF6SndEbEZ5OVRfMTFCajRRRW0tYnFnY0o1VXJlcGkxcmpVR0k2ZE15aEsyNGxFVUViUTJ6dERxbTJuU2ltQTg3Y1g; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:08:54 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21968-LGA"
+          ],
+          "X-Timer": [
+            "S1588043335.643016,VS0,VE92"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "597.0"
+          ],
+          "x-ratelimit-reset": [
+            "66"
+          ],
+          "x-ratelimit-used": [
+            "3"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:08:54",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&new_rule_order=Test%2520post%252012%2Ctesy%2520all%2CPRAW%2520Update&r=<TEST_SUBREDDIT>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "100"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=HY2KNCAqs99FB5pXQu; session_tracker=ZgMW4PeBhRKLF3BWlL.0.1588043334687.Z0FBQUFBQmVwNTVHNFcxZVdVOHF1aE0yYzNSWXEtVklva0RXRjM3VnQ1Ty1iQVNHWTRUUFByUVY1RWlQTmk1a1lqUU04eWFaOFF6SndEbEZ5OVRfMTFCajRRRW0tYnFnY0o1VXJlcGkxcmpVR0k2ZE15aEsyNGxFVUViUTJ6dERxbTJuU2ltQTg3Y1g"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"explanation\": \"Rule ordering doesn't account for 1 or more rules in             subreddit's rules\", \"message\": \"Bad Request\", \"reason\": \"SR_RULE_MISSING_FROM_ORDER\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "167"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:08:54 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21968-LGA"
+          ],
+          "X-Timer": [
+            "S1588043335.760061,VS0,VE96"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=ZgMW4PeBhRKLF3BWlL.0.1588043334804.Z0FBQUFBQmVwNTVHSmN4akRIeXNYNGNDSFp3MlU4ZEd0SXMwOWdTOWtIbGVXOGZYVnFoSTlFMzNNdVo1R0VVQWZSdGFKQmVsWU1BVkcyYUpFcWcwUkhGY05CaHlSQmV5aFdUekxMLXA0bHBoWEphNFc0S2FBbUxHWFlUd2l0Tkc4TUtGN2xzcGhxdFo; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:08:54 GMT; secure",
+            "loid=00000000006bomi11y.2.1588043334849.Z0FBQUFBQmVwNTVHUEJZNjhrY3I2aldFRlRwcDZuOUQ2eGtzQmhucFNoTllsRDB0Y2xXbnRGQnFON2NkYm9tOVpMcGpmOVZZQjR1X2VyOGFGODlpeXFjVkFhczFEbHZrTUhfZ3FMVzBJT3o0SE1sb3BScGw4eWhLdkdXVzRLdERUaHpTeDVPTEZHemI; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Thu, 28-Apr-2022 03:08:54 GMT; secure",
+            "session_tracker=ZgMW4PeBhRKLF3BWlL.0.1588043334849.Z0FBQUFBQmVwNTVHWVFjbTFFNGxJejNxX1FkdFFEMVpfTUJvWkpWaEpFZjc3cE5ISTktMHRKcVhmMldLRjZCMjJMTUxfNVpBeGZCMFg2MVRua014b3ZzY0pTa2RGSm9GWC1PdEt0R1oyVEtOYnp2dzZYazQ2M3BNNTRXblFOdnNhS3FhU01iUkFEUlM; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:08:54 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "596.0"
+          ],
+          "x-ratelimit-reset": [
+            "66"
+          ],
+          "x-ratelimit-used": [
+            "4"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 400,
+          "message": "Bad Request"
+        },
+        "url": "https://oauth.reddit.com/api/reorder_subreddit_rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_update_rule.json b/tests/integration/cassettes/TestRule.test_update_rule.json
new file mode 100644
index 00000000..efc6fe3a
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_update_rule.json
@@ -0,0 +1,342 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T04:13:59",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:13:58 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=Au3vjDjNYh73wDBjre; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21950-LGA"
+          ],
+          "X-Timer": [
+            "S1587960839.662262,VS0,VE337"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:13:59",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=Au3vjDjNYh73wDBjre"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"all\", \"description\": \"d\", \"short_name\": \"tesy all\", \"violation_reason\": \"df\", \"created_utc\": 1587969502.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Ed\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"link\", \"description\": \"r\", \"short_name\": \"Test comment\", \"violation_reason\": \"Comment test\", \"created_utc\": 1587949225.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Er\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5024"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:13:59 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=863gOlyruocvYXHEXP.0.1587960839170.Z0FBQUFBQmVwbHdIaUE0VGlqaWM5Zm1EWTE1bDZKTVVLY0lXN25LX0x2dnFPTU8zRmZySEtxQmNWd1BPbUVlTkJjRWlCRjlQYjR2Nk93THEya3RScW02OEw2bXFkY0NtMHhhOTJMSllDcGo5NmJxaC1JTlFpMmNjdGR4dGV2dll1dFU1N1F0TjF5ZXc; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:13:59 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21943-LGA"
+          ],
+          "X-Timer": [
+            "S1587960839.131155,VS0,VE76"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "595.0"
+          ],
+          "x-ratelimit-reset": [
+            "361"
+          ],
+          "x-ratelimit-used": [
+            "5"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:13:59",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&description=Updated+rule&kind=link&old_short_name=tesy+all&r=<TEST_SUBREDDIT>&short_name=tesy+all&violation_reason=PUpdate"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "135"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=Au3vjDjNYh73wDBjre; session_tracker=863gOlyruocvYXHEXP.0.1587960839170.Z0FBQUFBQmVwbHdIaUE0VGlqaWM5Zm1EWTE1bDZKTVVLY0lXN25LX0x2dnFPTU8zRmZySEtxQmNWd1BPbUVlTkJjRWlCRjlQYjR2Nk93THEya3RScW02OEw2bXFkY0NtMHhhOTJMSllDcGo5NmJxaC1JTlFpMmNjdGR4dGV2dll1dFU1N1F0TjF5ZXc"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"link\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"tesy all\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587969502.0, \\\"priority\\\": 0, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}]\", \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C!-- SC_ON --\\u003E\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "450"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:13:59 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21943-LGA"
+          ],
+          "X-Timer": [
+            "S1587960839.248086,VS0,VE139"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=863gOlyruocvYXHEXP.0.1587960839285.Z0FBQUFBQmVwbHdIWlY4cHp6a0o3bmg3UUFGbXB6XzJSY1dZT092U1NOQ3hBbzQwaG03V0xhMVVqemtzTDFjQ3dmUVFrNnF4T2hESGlwdG9obHA1ZDNwcjF2YWdXMk1wa21keFVDRExKcTkzc0QxVTNHUGxxTV94NXhOM0pFc0doMlR1X1M4RnVlX2s; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:13:59 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "594.0"
+          ],
+          "x-ratelimit-reset": [
+            "361"
+          ],
+          "x-ratelimit-used": [
+            "6"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_update_rule_no_params.json b/tests/integration/cassettes/TestRule.test_update_rule_no_params.json
new file mode 100644
index 00000000..0fc54d99
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_update_rule_no_params.json
@@ -0,0 +1,342 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-27T04:19:37",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:19:37 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=9eonSpm2y55VTomzZq; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21970-LGA"
+          ],
+          "X-Timer": [
+            "S1587961177.009262,VS0,VE309"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:19:37",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=9eonSpm2y55VTomzZq"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"link\", \"description\": \"Updated rule\", \"short_name\": \"tesy all\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587969502.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587949225.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 3}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5071"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:19:37 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=8n99kxSrroFoQqHhRz.0.1587961177458.Z0FBQUFBQmVwbDFaX1FLYXhOeW1MRHFVTm05MWhlUU92U2d0WWF2M1JmQXZmbWh1YUFIN21ucTNfYjcxR05CU1J1OUhZQUcxdlNDRDh2aW5YLU9JRWN3bUhuMGhtUVg2aVh1V1NJU0dVa0VpSlRQX1RhdVFoVzBWbHRZYTJoWUd4VXhpRko5ZEZYNUQ; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:19:37 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21940-LGA"
+          ],
+          "X-Timer": [
+            "S1587961177.418730,VS0,VE85"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "587.0"
+          ],
+          "x-ratelimit-reset": [
+            "23"
+          ],
+          "x-ratelimit-used": [
+            "13"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-27T04:19:37",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&description=Updated+rule&kind=comment&old_short_name=PRAW+Update&r=<TEST_SUBREDDIT>&short_name=PRAW+Update&violation_reason=PUpdate"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "144"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=9eonSpm2y55VTomzZq; session_tracker=8n99kxSrroFoQqHhRz.0.1587961177458.Z0FBQUFBQmVwbDFaX1FLYXhOeW1MRHFVTm05MWhlUU92U2d0WWF2M1JmQXZmbWh1YUFIN21ucTNfYjcxR05CU1J1OUhZQUcxdlNDRDh2aW5YLU9JRWN3bUhuMGhtUVg2aVh1V1NJU0dVa0VpSlRQX1RhdVFoVzBWbHRZYTJoWUd4VXhpRko5ZEZYNUQ"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"PRAW Update\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587949225.0, \\\"priority\\\": 1, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}]\", \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C!-- SC_ON --\\u003E\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "456"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Mon, 27 Apr 2020 04:19:37 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21940-LGA"
+          ],
+          "X-Timer": [
+            "S1587961178.530148,VS0,VE192"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=8n99kxSrroFoQqHhRz.0.1587961177567.Z0FBQUFBQmVwbDFadWJuRHFtWUwtbWwzS0ZROGdCWlQybldQdHNGSllhMGFwbW1wbGpORGtqUHFMcjRzcTJXVTJOYUM2YS1xYmZaUS1PY0ZwTWVmMHNTaXl1bGxwTUVXd0pXWmpub24xNzFveGw4bzBEMVhrMjdCaGdRTXBqM2tST1ZubzV5N294QTc; Domain=reddit.com; Max-Age=7199; Path=/; expires=Mon, 27-Apr-2020 06:19:37 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "586.0"
+          ],
+          "x-ratelimit-reset": [
+            "23"
+          ],
+          "x-ratelimit-used": [
+            "14"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestRule.test_update_rule_short_name.json b/tests/integration/cassettes/TestRule.test_update_rule_short_name.json
new file mode 100644
index 00000000..3e5968de
--- /dev/null
+++ b/tests/integration/cassettes/TestRule.test_update_rule_short_name.json
@@ -0,0 +1,458 @@
+{
+  "http_interactions": [
+    {
+      "recorded_at": "2020-04-28T03:17:19",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "grant_type=password&password=<PASSWORD>&username=<USERNAME>"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "Basic <BASIC_AUTH>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "61"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://www.reddit.com/api/v1/access_token"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "118"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:19 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "edgebucket=GRyYjA8sk9S0N469Yt; Domain=reddit.com; Max-Age=63071999; Path=/;  secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21955-LGA"
+          ],
+          "X-Timer": [
+            "S1588043839.307491,VS0,VE288"
+          ],
+          "cache-control": [
+            "max-age=0, must-revalidate"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://www.reddit.com/api/v1/access_token"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:17:20",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "edgebucket=GRyYjA8sk9S0N469Yt"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"\", \"short_name\": \"sdf\", \"violation_reason\": \"sdf\", \"created_utc\": 1587984896.0, \"priority\": 1}, {\"kind\": \"all\", \"description\": \"sdafdsafsdf\", \"short_name\": \"asdfasfsdaf\", \"violation_reason\": \"sdafdsaf\", \"created_utc\": 1588072423.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsdfsaf\", \"short_name\": \"asdfdasfsa\", \"violation_reason\": \"asdfdasfsa\", \"created_utc\": 1588072426.0, \"priority\": 3, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"ghfghgf\", \"short_name\": \"dfghfgdhfg\", \"violation_reason\": \"fgdhfdghf\", \"created_utc\": 1588072572.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Eghfghgf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5361"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:20 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=7XsTSVhZIL975xOONS.0.1588043839970.Z0FBQUFBQmVwNkJBUlV4TkRST1RYWDVEZkhkUHNiU2Naekprb1ZUM0RpTkRYQ2xEQ0ZXRDJRYnJWaFNXX1NvQ0prTHJlQU5tUGZ1ZEl6THBiLVhveGhCU0pKQTZrNWhlZ2pqck9kUzBCa3d4cVNIcUlPWWYtT0wzUHJMQzJReHYzWjl1MHlTeUhnZDY; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:20 GMT; secure; SameSite=None; Secure",
+            "csv=1; Max-Age=63072000; Domain=.reddit.com; Path=/; Secure; SameSite=None"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21920-LGA"
+          ],
+          "X-Timer": [
+            "S1588043840.930024,VS0,VE84"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "592.0"
+          ],
+          "x-ratelimit-reset": [
+            "161"
+          ],
+          "x-ratelimit-used": [
+            "8"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:17:20",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": "api_type=json&description=Updated+rule&kind=comment&old_short_name=sdf&r=<TEST_SUBREDDIT>&short_name=PRAW+Update&violation_reason=PUpdate"
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "136"
+          ],
+          "Content-Type": [
+            "application/x-www-form-urlencoded"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=GRyYjA8sk9S0N469Yt; session_tracker=7XsTSVhZIL975xOONS.0.1588043839970.Z0FBQUFBQmVwNkJBUlV4TkRST1RYWDVEZkhkUHNiU2Naekprb1ZUM0RpTkRYQ2xEQ0ZXRDJRYnJWaFNXX1NvQ0prTHJlQU5tUGZ1ZEl6THBiLVhveGhCU0pKQTZrNWhlZ2pqck9kUzBCa3d4cVNIcUlPWWYtT0wzUHJMQzJReHYzWjl1MHlTeUhnZDY"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "POST",
+        "uri": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"json\": {\"errors\": [], \"data\": {\"rules\": \"[{\\\"kind\\\": \\\"comment\\\", \\\"description\\\": \\\"Updated rule\\\", \\\"short_name\\\": \\\"PRAW Update\\\", \\\"violation_reason\\\": \\\"PUpdate\\\", \\\"created_utc\\\": 1587984896.0, \\\"priority\\\": 1, \\\"description_html\\\": \\\"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\\\n\\u003C!-- SC_ON --\\u003E\\\"}]\", \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C!-- SC_ON --\\u003E\"}}}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "456"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:20 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21920-LGA"
+          ],
+          "X-Timer": [
+            "S1588043840.043411,VS0,VE196"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "set-cookie": [
+            "session_tracker=7XsTSVhZIL975xOONS.0.1588043840092.Z0FBQUFBQmVwNkJBZTg1dkRjTXZqNXlNUEJsbUFweGFFcjM3bDRnZjI1c016czg4ZnFYanJqa3prUkhtb2puNUx5M1REbW4tbHB4ODVmaFd3ZzlZa2lhaTl2RE9QTlBsbkJ3aVJ0aC1xRnlWYi1DSF9CVUk3Tzh4NGF0YlhDb0x2akJqTjZpQ0QyZng; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:20 GMT; secure"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "591.0"
+          ],
+          "x-ratelimit-reset": [
+            "160"
+          ],
+          "x-ratelimit-used": [
+            "9"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/api/update_subreddit_rule?raw_json=1"
+      }
+    },
+    {
+      "recorded_at": "2020-04-28T03:17:20",
+      "request": {
+        "body": {
+          "encoding": "utf-8",
+          "string": ""
+        },
+        "headers": {
+          "Accept": [
+            "*/*"
+          ],
+          "Accept-Encoding": [
+            "identity"
+          ],
+          "Authorization": [
+            "bearer <ACCESS_TOKEN>"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Cookie": [
+            "csv=1; edgebucket=GRyYjA8sk9S0N469Yt; session_tracker=7XsTSVhZIL975xOONS.0.1588043840092.Z0FBQUFBQmVwNkJBZTg1dkRjTXZqNXlNUEJsbUFweGFFcjM3bDRnZjI1c016czg4ZnFYanJqa3prUkhtb2puNUx5M1REbW4tbHB4ODVmaFd3ZzlZa2lhaTl2RE9QTlBsbkJ3aVJ0aC1xRnlWYi1DSF9CVUk3Tzh4NGF0YlhDb0x2akJqTjZpQ0QyZng"
+          ],
+          "User-Agent": [
+            "<USER_AGENT> PRAW/7.0.1.dev0 prawcore/1.3.0"
+          ]
+        },
+        "method": "GET",
+        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      },
+      "response": {
+        "body": {
+          "encoding": "UTF-8",
+          "string": "{\"rules\": [{\"kind\": \"comment\", \"description\": \"testing post rf\", \"short_name\": \"Test post 12\", \"violation_reason\": \"34\", \"created_utc\": 1587949210.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Etesting post rf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"comment\", \"description\": \"Updated rule\", \"short_name\": \"PRAW Update\", \"violation_reason\": \"PUpdate\", \"created_utc\": 1587984896.0, \"priority\": 1, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003EUpdated rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"sdafdsafsdf\", \"short_name\": \"asdfasfsdaf\", \"violation_reason\": \"sdafdsaf\", \"created_utc\": 1588072423.0, \"priority\": 2, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Esdafdsafsdf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"fsdfsaf\", \"short_name\": \"asdfdasfsa\", \"violation_reason\": \"asdfdasfsa\", \"created_utc\": 1588072426.0, \"priority\": 3, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Efsdfsaf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}, {\"kind\": \"all\", \"description\": \"ghfghgf\", \"short_name\": \"dfghfgdhfg\", \"violation_reason\": \"fgdhfdghf\", \"created_utc\": 1588072572.0, \"priority\": 4, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003Eghfghgf\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"], \"site_rules_flow\": [{\"reasonTextToShow\": \"This is spam\", \"reasonText\": \"This is spam\"}, {\"nextStepHeader\": \"In what way?\", \"reasonTextToShow\": \"This is abusive or harassing\", \"nextStepReasons\": [{\"nextStepHeader\": \"Who is the harassment targeted at?\", \"reasonTextToShow\": \"It's targeted harassment\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It's targeted harassment at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It's targeted harassment at someone else\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"Who is the threat directed at?\", \"reasonTextToShow\": \"It threatens violence or physical harm\", \"nextStepReasons\": [{\"reasonTextToShow\": \"At me\", \"reasonText\": \"It threatens violence or physical harm at me\"}, {\"reasonTextToShow\": \"At someone else\", \"reasonText\": \"It threatens violence or physical harm at someone else\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's rude, vulgar or offensive\", \"reasonText\": \"It's rude, vulgar or offensive\"}, {\"reasonTextToShow\": \"It's abusing the report button\", \"canWriteNotes\": true, \"isAbuseOfReportButton\": true, \"notesInputTitle\": \"Additional information (optional)\", \"reasonText\": \"It's abusing the report button\"}], \"reasonText\": \"\"}, {\"nextStepHeader\": \"What issue?\", \"reasonTextToShow\": \"Other issues\", \"nextStepReasons\": [{\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=COPYRIGHT\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my copyright\", \"reasonTextToShow\": \"It infringes my copyright\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=TRADEMARK\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"It infringes my trademark rights\", \"reasonTextToShow\": \"It infringes my trademark rights\", \"fileComplaint\": true, \"complaintPrompt\": \"If you think content on Reddit violates your intellectual property, please file a complaint at the link below:\"}, {\"reasonTextToShow\": \"It's personal and confidential information\", \"reasonText\": \"It's personal and confidential information\"}, {\"reasonTextToShow\": \"It's sexual or suggestive content involving minors\", \"reasonText\": \"It's sexual or suggestive content involving minors\"}, {\"nextStepHeader\": \"Do you appear in the image?\", \"reasonTextToShow\": \"It's involuntary pornography\", \"nextStepReasons\": [{\"reasonTextToShow\": \"I appear in the image\", \"reasonText\": \"It's involuntary pornography and i appear in it\"}, {\"reasonTextToShow\": \"I do not appear in the image\", \"reasonText\": \"It's involuntary pornography and i do not appear in it\"}], \"reasonText\": \"\"}, {\"reasonTextToShow\": \"It's a transaction for prohibited goods or services\", \"reasonText\": \"It's a transaction for prohibited goods or services\"}, {\"complaintButtonText\": \"File a complaint\", \"complaintUrl\": \"https://www.reddit.com/api/report_redirect?thing=%25%28thing%29s\\u0026reason_code=NETZDG\", \"complaintPageTitle\": \"File a complaint?\", \"reasonText\": \"Report this content under NetzDG\", \"reasonTextToShow\": \"Report this content under NetzDG\", \"fileComplaint\": true, \"complaintPrompt\": \"This reporting procedure is only available for people in Germany. If you are in Germany and would like to report this content under the German Netzwerkdurchsetzungsgesetz (NetzDG) law you may file a complaint by clicking the link below.\"}, {\"usernamesInputTitle\": \"Username\", \"reasonTextToShow\": \"Someone is considering suicide or serious self-harm.\", \"canSpecifyUsernames\": true, \"reasonText\": \"Someone is considering suicide or serious self-harm.\", \"requestCrisisSupport\": true, \"oneUsername\": true}], \"reasonText\": \"\"}]}"
+        },
+        "headers": {
+          "Accept-Ranges": [
+            "bytes"
+          ],
+          "Connection": [
+            "keep-alive"
+          ],
+          "Content-Length": [
+            "5547"
+          ],
+          "Content-Type": [
+            "application/json; charset=UTF-8"
+          ],
+          "Date": [
+            "Tue, 28 Apr 2020 03:17:20 GMT"
+          ],
+          "Server": [
+            "snooserv"
+          ],
+          "Set-Cookie": [
+            "session_tracker=7XsTSVhZIL975xOONS.0.1588043840307.Z0FBQUFBQmVwNkJBaEJXZHNQMUw3VVpHcUlxa19CdlZ1TFc3SXBLclNlX1NDZEc4V2p4STJWN3hQYm9fY3FoQ2FSWW9BRE5QMlVrc0ZFVFRTRHBuOF9hamVxZndWU0Q0S2R5Y19HSGhtUllORlg3MDlBcXhzUVVnT0RibGx1djNLT3VoZnFqVlRPdGY; Domain=reddit.com; Max-Age=7199; Path=/; expires=Tue, 28-Apr-2020 05:17:20 GMT; secure; SameSite=None; Secure"
+          ],
+          "Strict-Transport-Security": [
+            "max-age=15552000; includeSubDomains; preload"
+          ],
+          "Vary": [
+            "accept-encoding"
+          ],
+          "Via": [
+            "1.1 varnish"
+          ],
+          "X-Cache": [
+            "MISS"
+          ],
+          "X-Cache-Hits": [
+            "0"
+          ],
+          "X-Moose": [
+            "majestic"
+          ],
+          "X-Served-By": [
+            "cache-lga21920-LGA"
+          ],
+          "X-Timer": [
+            "S1588043840.264373,VS0,VE89"
+          ],
+          "cache-control": [
+            "private, s-maxage=0, max-age=0, must-revalidate, no-store, max-age=0, must-revalidate"
+          ],
+          "expires": [
+            "-1"
+          ],
+          "x-content-type-options": [
+            "nosniff"
+          ],
+          "x-frame-options": [
+            "SAMEORIGIN"
+          ],
+          "x-ratelimit-remaining": [
+            "590.0"
+          ],
+          "x-ratelimit-reset": [
+            "160"
+          ],
+          "x-ratelimit-used": [
+            "10"
+          ],
+          "x-ua-compatible": [
+            "IE=edge"
+          ],
+          "x-xss-protection": [
+            "1; mode=block"
+          ]
+        },
+        "status": {
+          "code": 200,
+          "message": "OK"
+        },
+        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
+      }
+    }
+  ],
+  "recorded_with": "betamax/0.8.1"
+}
diff --git a/tests/integration/cassettes/TestSubreddit.test_rules.json b/tests/integration/cassettes/TestSubreddit.test_rules.json
deleted file mode 100644
index d0917630..00000000
--- a/tests/integration/cassettes/TestSubreddit.test_rules.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
-  "http_interactions": [
-    {
-      "recorded_at": "2016-12-29T01:38:30",
-      "request": {
-        "body": {
-          "encoding": "utf-8",
-          "string": "grant_type=client_credentials"
-        },
-        "headers": {
-          "Accept": "*/*",
-          "Accept-Encoding": "identity",
-          "Authorization": "Basic <BASIC_AUTH>",
-          "Connection": "keep-alive",
-          "Content-Length": "29",
-          "Content-Type": "application/x-www-form-urlencoded",
-          "User-Agent": "<USER_AGENT> PRAW/4.2.0dev0 prawcore/0.6.0"
-        },
-        "method": "POST",
-        "uri": "https://www.reddit.com/api/v1/access_token"
-      },
-      "response": {
-        "body": {
-          "encoding": "UTF-8",
-          "string": "{\"access_token\": \"<ACCESS_TOKEN>\", \"token_type\": \"bearer\", \"expires_in\": 3600, \"scope\": \"*\"}"
-        },
-        "headers": {
-          "Accept-Ranges": "bytes",
-          "Connection": "keep-alive",
-          "Content-Length": "105",
-          "Content-Type": "application/json; charset=UTF-8",
-          "Date": "Thu, 29 Dec 2016 01:38:31 GMT",
-          "Server": "snooserv",
-          "Set-Cookie": "loid=v0RWuVRxcgEA6qBFWO; Domain=reddit.com; Max-Age=63071999; Path=/;  secure",
-          "Strict-Transport-Security": "max-age=15552000; includeSubDomains; preload",
-          "Via": "1.1 varnish",
-          "X-Cache": "MISS",
-          "X-Cache-Hits": "0",
-          "X-Moose": "majestic",
-          "X-Served-By": "cache-ord1739-ORD",
-          "X-Timer": "S1482975511.910025,VS0,VE33",
-          "cache-control": "max-age=0, must-revalidate",
-          "x-content-type-options": "nosniff",
-          "x-frame-options": "SAMEORIGIN",
-          "x-xss-protection": "1; mode=block"
-        },
-        "status": {
-          "code": 200,
-          "message": "OK"
-        },
-        "url": "https://www.reddit.com/api/v1/access_token"
-      }
-    },
-    {
-      "recorded_at": "2016-12-29T01:38:30",
-      "request": {
-        "body": {
-          "encoding": "utf-8",
-          "string": ""
-        },
-        "headers": {
-          "Accept": "*/*",
-          "Accept-Encoding": "identity",
-          "Authorization": "bearer <ACCESS_TOKEN>",
-          "Connection": "keep-alive",
-          "Cookie": "loid=v0RWuVRxcgEA6qBFWO; loidcreated=1482975511000",
-          "User-Agent": "<USER_AGENT> PRAW/4.2.0dev0 prawcore/0.6.0"
-        },
-        "method": "GET",
-        "uri": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
-      },
-      "response": {
-        "body": {
-          "encoding": "UTF-8",
-          "string": "{\"rules\": [{\"kind\": \"all\", \"description\": \"Sample rule\", \"short_name\": \"Sample rule\", \"created_utc\": 1465639064.0, \"priority\": 0, \"description_html\": \"\\u003C!-- SC_OFF --\\u003E\\u003Cdiv class=\\\"md\\\"\\u003E\\u003Cp\\u003ESample rule\\u003C/p\\u003E\\n\\u003C/div\\u003E\\u003C!-- SC_ON --\\u003E\"}], \"site_rules\": [\"Spam\", \"Personal and confidential information\", \"Threatening, harassing, or inciting violence\"]}"
-        },
-        "headers": {
-          "Accept-Ranges": "bytes",
-          "Connection": "keep-alive",
-          "Content-Length": "401",
-          "Content-Type": "application/json; charset=UTF-8",
-          "Date": "Thu, 29 Dec 2016 01:38:32 GMT",
-          "Server": "snooserv",
-          "Strict-Transport-Security": "max-age=15552000; includeSubDomains; preload",
-          "Via": "1.1 varnish",
-          "X-Cache": "MISS",
-          "X-Cache-Hits": "0",
-          "X-Moose": "majestic",
-          "X-Served-By": "cache-ord1746-ORD",
-          "X-Timer": "S1482975512.140447,VS0,VE57",
-          "access-control-allow-origin": "*",
-          "access-control-expose-headers": "X-Reddit-Tracking, X-Moose",
-          "cache-control": "max-age=0, must-revalidate",
-          "x-content-type-options": "nosniff",
-          "x-frame-options": "SAMEORIGIN",
-          "x-reddit-tracking": "https://pixel.redditmedia.com/pixel/of_destiny.png?v=TcngVum1mDzY4ET5NBd8s1JBqT6O%2FZP44Dg1t9Vb2hmevB9Az87IILAojI56jDkOTBkloX8TJpBQsLFvmJOuSuZ%2B7beYBq07",
-          "x-ua-compatible": "IE=edge",
-          "x-xss-protection": "1; mode=block"
-        },
-        "status": {
-          "code": 200,
-          "message": "OK"
-        },
-        "url": "https://oauth.reddit.com/r/<TEST_SUBREDDIT>/about/rules?raw_json=1"
-      }
-    }
-  ],
-  "recorded_with": "betamax/0.8.0"
-}
diff --git a/tests/integration/models/reddit/test_rules.py b/tests/integration/models/reddit/test_rules.py
new file mode 100644
index 00000000..4da2f833
--- /dev/null
+++ b/tests/integration/models/reddit/test_rules.py
@@ -0,0 +1,194 @@
+from unittest import mock
+import pytest
+
+from praw.exceptions import RedditAPIException, ClientException
+from praw.models import Rule
+
+from ... import IntegrationTest
+
+
+class TestRule(IntegrationTest):
+    @property
+    def subreddit(self):
+        return self.reddit.subreddit(pytest.placeholders.test_subreddit)
+
+    def test_add_rule(self):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_add_rule"):
+            rule = self.subreddit.rules.mod.add(
+                "PRAW Test",
+                "all",
+                description="Test by PRAW",
+                violation_reason="PTest",
+            )
+            assert rule.short_name == "PRAW Test"
+            assert rule.kind == "all"
+            assert rule.description == "Test by PRAW"
+            assert rule.violation_reason == "PTest"
+
+    def test_add_rule_without_violation_reason(self):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette(
+            "TestRule.test_add_rule_without_violation_reason"
+        ):
+            rule = self.subreddit.rules.mod.add("PRAW Test 2", "comment")
+            assert rule.short_name == "PRAW Test 2"
+            assert rule.kind == "comment"
+            assert rule.description == ""
+            assert rule.violation_reason == "PRAW Test 2"
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_delete_rule(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_delete_rule"):
+            rules = list(self.subreddit.rules)
+            rule = rules[-1]
+            rule.mod.delete()
+            assert len(list(self.subreddit.rules)) == (len(rules) - 1)
+
+    def test_iter_rules(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            for rule in self.subreddit.rules:
+                assert isinstance(rule, Rule)
+
+    @pytest.mark.filterwarnings("ignore", category=DeprecationWarning)
+    def test_iter_call(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            for rule in self.subreddit.rules():
+                assert isinstance(rule, Rule)
+
+    def test_iter_rule_string(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            rule = self.subreddit.rules["PRAW Test"]
+            assert isinstance(rule, Rule)
+            rule._fetch()
+            assert "kind" in vars(rule)
+
+    def test_iter_rule_invalid(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            rule = self.subreddit.rules["fake rule"]
+            with pytest.raises(ClientException) as excinfo:
+                rule.kind
+            assert excinfo.value.args[
+                0
+            ] == "Subreddit {} does not have the rule {}".format(
+                self.subreddit, "fake rule"
+            )
+
+    def test_iter_rule_int(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            assert isinstance(self.subreddit.rules[0], Rule)
+
+    def test_iter_rule_negative_int(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            assert isinstance(self.subreddit.rules[-1], Rule)
+
+    def test_iter_rule_slice(self):
+        with self.recorder.use_cassette("TestRule.test_iter_rules"):
+            rules = self.subreddit.rules[-3:]
+            assert len(rules) == 3
+            for rule in rules:
+                assert isinstance(rule, Rule)
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_reorder_rules(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_reorder_rules"):
+            rule_list = list(self.subreddit.rules)
+            reordered = rule_list[2:3] + rule_list[0:2] + rule_list[3:]
+            rule_info = {rule.short_name: rule for rule in rule_list}
+            self.subreddit.rules.mod.reorder(reordered)
+            new_rules = list(self.subreddit.rules)
+            assert new_rules != rule_list
+            for rule in new_rules:
+                assert rule_info[rule.short_name] == rule
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_reorder_rules_double(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_reorder_rules_double"):
+            rule_list = list(self.subreddit.rules)
+            with pytest.raises(RedditAPIException):
+                self.subreddit.rules.mod.reorder(rule_list + rule_list[0:1])
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_reorder_rules_empty(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_reorder_rules_empty"):
+            with pytest.raises(RedditAPIException):
+                self.subreddit.rules.mod.reorder([])
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_reorder_rules_no_reorder(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette(
+            "TestRule.test_reorder_rules_no_reorder"
+        ):
+            rule_list = list(self.subreddit.rules)
+            assert self.subreddit.rules.mod.reorder(rule_list) == rule_list
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_reorder_rules_omit(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_reorder_rules_omit"):
+            rule_list = list(self.subreddit.rules)
+            with pytest.raises(RedditAPIException):
+                self.subreddit.rules.mod.reorder(rule_list[:-1])
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_update_rule(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_update_rule"):
+            rule = self.subreddit.rules[0]
+            rule2 = rule.mod.update(
+                description="Updated rule",
+                kind="link",
+                violation_reason="PUpdate",
+            )
+            assert rule.description != rule2.description
+            assert rule2.description == "Updated rule"
+            assert rule.kind != rule2.kind
+            assert rule2.kind == "link"
+            assert rule.violation_reason != rule2.violation_reason
+            assert rule2.violation_reason == "PUpdate"
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_update_rule_short_name(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette(
+            "TestRule.test_update_rule_short_name"
+        ):
+            rule = self.subreddit.rules[1]
+            rule2 = rule.mod.update(
+                short_name="PRAW Update",
+                description="Updated rule",
+                kind="comment",
+                violation_reason="PUpdate",
+            )
+            assert rule != rule2
+            assert rule2.short_name == "PRAW Update"
+            assert rule.description != rule2.description
+            assert rule2.description == "Updated rule"
+            assert rule.kind != rule2.kind
+            assert rule2.kind == "comment"
+            assert rule.violation_reason != rule2.violation_reason
+            assert rule2.violation_reason == "PUpdate"
+            for new_rule in self.subreddit.rules:
+                assert new_rule.short_name != rule.short_name
+
+    @mock.patch("time.sleep", return_value=None)
+    def test_update_rule_no_params(self, _):
+        self.reddit.read_only = False
+        with self.recorder.use_cassette("TestRule.test_update_rule_no_params"):
+            rule = self.subreddit.rules[1]
+            rule2 = rule.mod.update()
+            for attr in (
+                "created_utc",
+                "description",
+                "kind",
+                "priority",
+                "short_name",
+                "subreddit",
+                "violation_reason",
+            ):
+                assert getattr(rule, attr) == getattr(rule2, attr)
diff --git a/tests/integration/models/reddit/test_subreddit.py b/tests/integration/models/reddit/test_subreddit.py
index 85233a7b..ddf396de 100644
--- a/tests/integration/models/reddit/test_subreddit.py
+++ b/tests/integration/models/reddit/test_subreddit.py
@@ -221,13 +221,6 @@ class TestSubreddit(IntegrationTest):
             subreddit = self.reddit.subreddit("wallpapers")
             assert subreddit.random() is None
 
-    def test_rules(self):
-        with self.recorder.use_cassette("TestSubreddit.test_rules"):
-            subreddit = self.reddit.subreddit(
-                pytest.placeholders.test_subreddit
-            )
-            assert subreddit.rules()["rules"][0]["short_name"] == "Sample rule"
-
     def test_sticky(self):
         subreddit = self.reddit.subreddit(pytest.placeholders.test_subreddit)
         with self.recorder.use_cassette("TestSubreddit.test_sticky"):
diff --git a/tests/unit/models/reddit/test_rules.py b/tests/unit/models/reddit/test_rules.py
new file mode 100644
index 00000000..037b3fdc
--- /dev/null
+++ b/tests/unit/models/reddit/test_rules.py
@@ -0,0 +1,35 @@
+import pytest
+
+from praw.models import Rule
+from ... import UnitTest
+
+
+class TestRules(UnitTest):
+    @property
+    def subreddit(self):
+        return self.reddit.subreddit(pytest.placeholders.test_subreddit)
+
+    def test_no_data(self):
+        with pytest.raises(ValueError) as excinfo:
+            Rule(self.reddit, self.subreddit)
+        assert (
+            excinfo.value.args[0]
+            == "Either short_name or _data needs to be given."
+        )
+
+    def test_both_data(self):
+        with pytest.raises(ValueError) as excinfo:
+            Rule(self.reddit, self.subreddit, short_name="test", _data={})
+        assert (
+            excinfo.value.args[0]
+            == "Either short_name or _data needs to be given."
+        )
+
+    def test_no_subreddit(self):
+        rule = Rule(self.reddit, short_name="test")
+        with pytest.raises(ValueError) as excinfo:
+            getattr(rule, "subreddit")
+        assert (
+            excinfo.value.args[0]
+            == "The Rule is missing a subreddit. File a bug report at PRAW."
+        )
diff --git a/tests/unit/test_deprecations.py b/tests/unit/test_deprecations.py
index 4e297d95..b56b273e 100644
--- a/tests/unit/test_deprecations.py
+++ b/tests/unit/test_deprecations.py
@@ -18,7 +18,7 @@ class TestDeprecation(UnitTest):
         with pytest.raises(DeprecationWarning):
             self.reddit.validate_on_submit
 
-    def test_apiexception(self):
+    def test_api_exception(self):
         exc = APIException(["test", "testing", "test"])
         with pytest.raises(DeprecationWarning):
             exc.error_type
@@ -26,3 +26,11 @@ class TestDeprecation(UnitTest):
             exc.message
         with pytest.raises(DeprecationWarning):
             exc.field
+
+    def test_subreddit_rules_call(self):
+        with pytest.raises(DeprecationWarning) as excinfo:
+            self.reddit.subreddit("test").rules()
+        assert (
+            excinfo.value.args[0] == "Calling SubredditRules to get a list of "
+            "rules is deprecated. Remove the parentheses to use the iterator."
+        )