<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="firebaserules_v1.html">Firebase Rules API</a> . <a href="firebaserules_v1.projects.html">projects</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="firebaserules_v1.projects.releases.html">releases()</a></code>
</p>
<p class="firstline">Returns the releases Resource.</p>

<p class="toc_element">
  <code><a href="firebaserules_v1.projects.rulesets.html">rulesets()</a></code>
</p>
<p class="firstline">Returns the rulesets Resource.</p>

<p class="toc_element">
  <code><a href="#test">test(name, body, x__xgafv=None)</a></code></p>
<p class="firstline">Test `Source` for syntactic and semantic correctness. Issues present, if</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="test">test(name, body, x__xgafv=None)</code>
  <pre>Test `Source` for syntactic and semantic correctness. Issues present, if
any, will be returned to the caller with a description, severity, and
source location.

The test method may be executed with `Source` or a `Ruleset` name.
Passing `Source` is useful for unit testing new rules. Passing a `Ruleset`
name is useful for regression testing an existing rule.

The following is an example of `Source` that permits users to upload images
to a bucket bearing their user id and matching the correct metadata:

_*Example*_

    // Users are allowed to subscribe and unsubscribe to the blog.
    service firebase.storage {
      match /users/{userId}/images/{imageName} {
          allow write: if userId == request.auth.uid
              && (imageName.matches('*.png$')
              || imageName.matches('*.jpg$'))
              && resource.mimeType.matches('^image/')
      }
    }

Args:
  name: string, Tests may either provide `source` or a `Ruleset` resource name.

For tests against `source`, the resource name must refer to the project:
Format: `projects/{project_id}`

For tests against a `Ruleset`, this must be the `Ruleset` resource name:
Format: `projects/{project_id}/rulesets/{ruleset_id}` (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for FirebaseRulesService.TestRuleset.
    "source": { # `Source` is one or more `File` messages comprising a logical set of rules. # Optional `Source` to be checked for correctness.
        # 
        # This field must not be set when the resource name refers to a `Ruleset`.
      "files": [ # `File` set constituting the `Source` bundle.
        { # `File` containing source content.
          "content": "A String", # Textual Content.
          "name": "A String", # File name.
          "fingerprint": "A String", # Fingerprint (e.g. github sha) associated with the `File`.
        },
      ],
    },
    "testSuite": { # `TestSuite` is a collection of `TestCase` instances that validate the logical # Inline `TestSuite` to run.
        # correctness of a `Ruleset`. The `TestSuite` may be referenced in-line within
        # a `TestRuleset` invocation or as part of a `Release` object as a pre-release
        # check.
      "testCases": [ # Collection of test cases associated with the `TestSuite`.
        { # `TestCase` messages provide the request context and an expectation as to
            # whether the given context will be allowed or denied. Test cases may specify
            # the `request`, `resource`, and `function_mocks` to mock a function call to
            # a service-provided function.
            #
            # The `request` object represents context present at request-time.
            #
            # The `resource` is the value of the target resource as it appears in
            # persistent storage before the request is executed.
          "functionMocks": [ # Optional function mocks for service-defined functions. If not set, any
              # service defined function is expected to return an error, which may or may
              # not influence the test outcome.
            { # Mock function definition.
                #
                # Mocks must refer to a function declared by the target service. The type of
                # the function args and result will be inferred at test time. If either the
                # arg or result values are not compatible with function type declaration, the
                # request will be considered invalid.
                #
                # More than one `FunctionMock` may be provided for a given function name so
                # long as the `Arg` matchers are distinct. There may be only one function
                # for a given overload where all `Arg` values are `Arg.any_value`.
              "function": "A String", # The name of the function.
                  #
                  # The function name must match one provided by a service declaration.
              "args": [ # The list of `Arg` values to match. The order in which the arguments are
                  # provided is the order in which they must appear in the function
                  # invocation.
                { # Arg matchers for the mock function.
                  "anyValue": { # A generic empty message that you can re-use to avoid defining duplicated # Argument matches any value provided.
                      # empty messages in your APIs. A typical example is to use it as the request
                      # or the response type of an API method. For instance:
                      #
                      #     service Foo {
                      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
                      #     }
                      #
                      # The JSON representation for `Empty` is empty JSON object `{}`.
                  },
                  "exactValue": "", # Argument exactly matches value provided.
                },
              ],
              "result": { # Possible result values from the function mock invocation. # The mock result of the function call.
                "undefined": { # A generic empty message that you can re-use to avoid defining duplicated # The result is undefined, meaning the result could not be computed.
                    # empty messages in your APIs. A typical example is to use it as the request
                    # or the response type of an API method. For instance:
                    #
                    #     service Foo {
                    #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
                    #     }
                    #
                    # The JSON representation for `Empty` is empty JSON object `{}`.
                },
                "value": "", # The result is an actual value. The type of the value must match that
                    # of the type declared by the service.
              },
            },
          ],
          "request": "", # Request context.
              #
              # The exact format of the request context is service-dependent. See the
              # appropriate service documentation for information about the supported
              # fields and types on the request. Minimally, all services support the
              # following fields and types:
              #
              # Request field  | Type
              # ---------------|-----------------
              # auth.uid       | `string`
              # auth.token     | `map<string, string>`
              # headers        | `map<string, string>`
              # method         | `string`
              # params         | `map<string, string>`
              # path           | `string`
              # time           | `google.protobuf.Timestamp`
              #
              # If the request value is not well-formed for the service, the request will
              # be rejected as an invalid argument.
          "resource": "", # Optional resource value as it appears in persistent storage before the
              # request is fulfilled.
              #
              # The resource type depends on the `request.path` value.
          "expectation": "A String", # Test expectation.
        },
      ],
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response for FirebaseRulesService.TestRuleset.
    "testResults": [ # The set of test results given the test cases in the `TestSuite`.
        # The results will appear in the same order as the test cases appear in the
        # `TestSuite`.
      { # Test result message containing the state of the test as well as a
          # description and source position for test failures.
        "debugMessages": [ # Debug messages related to test execution issues encountered during
            # evaluation.
            #
            # Debug messages may be related to too many or too few invocations of
            # function mocks or to runtime errors that occur during evaluation.
            #
            # For example: ```Unable to read variable [name: "resource"]```
          "A String",
        ],
        "visitedExpressions": [ # The set of visited permission expressions for a given test. This returns
            # the positions and evaluation results of all visited permission
            # expressions which were relevant to the test case, e.g.
            # ```
            # match /path {
            #   allow read if: <expr>
            # }
            # ```
            # For a detailed report of the intermediate evaluation states, see the
            # `expression_reports` field
          { # Store the position and access outcome for an expression visited in rules.
            "sourcePosition": { # Position in the `Source` content including its line, column number, and an # Position in the `Source` or `Ruleset` where an expression was visited.
                # index of the `File` in the `Source` message. Used for debug purposes.
              "column": 42, # First column on the source line associated with the source fragment.
              "line": 42, # Line number of the source fragment. 1-based.
              "fileName": "A String", # Name of the `File`.
            },
            "value": "", # The evaluated value for the visited expression, e.g. true/false
          },
        ],
        "state": "A String", # State of the test.
        "functionCalls": [ # The set of function calls made to service-defined methods.
            #
            # Function calls are included in the order in which they are encountered
            # during evaluation, are provided for both mocked and unmocked functions,
            # and included on the response regardless of the test `state`.
          { # Represents a service-defined function call that was invoked during test
              # execution.
            "function": "A String", # Name of the function invoked.
            "args": [ # The arguments that were provided to the function.
              "",
            ],
          },
        ],
        "errorPosition": { # Position in the `Source` content including its line, column number, and an # Position in the `Source` or `Ruleset` where the principle runtime error
            # occurs.
            #
            # Evaluation of an expression may result in an error. Rules are deny by
            # default, so a `DENY` expectation when an error is generated is valid.
            # When there is a `DENY` with an error, the `SourcePosition` is returned.
            #
            # E.g. `error_position { line: 19 column: 37 }`
            # index of the `File` in the `Source` message. Used for debug purposes.
          "column": 42, # First column on the source line associated with the source fragment.
          "line": 42, # Line number of the source fragment. 1-based.
          "fileName": "A String", # Name of the `File`.
        },
      },
    ],
    "issues": [ # Syntactic and semantic `Source` issues of varying severity. Issues of
        # `ERROR` severity will prevent tests from executing.
      { # Issues include warnings, errors, and deprecation notices.
        "sourcePosition": { # Position in the `Source` content including its line, column number, and an # Position of the issue in the `Source`.
            # index of the `File` in the `Source` message. Used for debug purposes.
          "column": 42, # First column on the source line associated with the source fragment.
          "line": 42, # Line number of the source fragment. 1-based.
          "fileName": "A String", # Name of the `File`.
        },
        "severity": "A String", # The severity of the issue.
        "description": "A String", # Short error description.
      },
    ],
  }</pre>
</div>

</body></html>