# S3

> Upload files to S3 buckets and check the objects your services write there.

Source: https://axx.nimbusxr.us/references/steps/aws-s3/

Upload files to S3 buckets and check the objects your services write there.

The steps use the scenario's AWS account (`the {word} aws account with the following properties:`, from aws-core). Checks wait for the object (10 seconds unless `within {duration}` says otherwise), since services write asynchronously: an upload that triggers processing (an S3 event notification to a queue, say) and the object that processing writes.

## `aws-s3.upload`

```gherkin
When the {filepath} file is uploaded to the {word} s3 bucket[[ as {word}]]
```

Upload a file (resolved against `resources`) to a s3 bucket, named after the file or as given. The content type follows the file's extension.

**Variants** (optional parts in `[[...]]` above):

- `the {filepath} file is uploaded to the {word} s3 bucket`
- `the {filepath} file is uploaded to the {word} s3 bucket as {word}`

**Parameters:** `{filepath}` (A file of the project, without whitespace: a path relative to the `resources` directories or to the directory of axx.yaml, or an absolute path. Editors link it to the file), `{word}` (one word, no spaces)

**Example:**

```gherkin
When the invoices/kestrel-2026-09.csv file is uploaded to the carrier-drops s3 bucket
When the invoices/kestrel-2026-09.csv file is uploaded to the carrier-drops s3 bucket as incoming/kestrel-2026-09.csv
```

_Since 0.1.0._

## `aws-s3.has`

```gherkin
Then [[within {duration} ]]the {word} s3 bucket has a(n) object named {word}
```

Wait (10s, or the given time) until the s3 bucket has an object with that name.

**Variants** (optional parts in `[[...]]` above):

- `the {word} s3 bucket has a(n) object named {word}`
- `within {duration} the {word} s3 bucket has a(n) object named {word}`

**Parameters:** `{duration}` (A duration in seconds or minutes, e.g. `5s` or `2m`), `{word}` (one word, no spaces)

**Example:**

```gherkin
Then within 30s the carrier-drops s3 bucket has a(n) object named disputes/kestrel-2026-09.csv
```

_Since 0.1.0._

## `aws-s3.identical`

```gherkin
Then [[within {duration} ]]the {word} object in the {word} s3 bucket is identical to the {filepath} file
```

Wait (10s, or the given time) until the object exists with exactly the content of the file (resolved against `resources`).

**Variants** (optional parts in `[[...]]` above):

- `the {word} object in the {word} s3 bucket is identical to the {filepath} file`
- `within {duration} the {word} object in the {word} s3 bucket is identical to the {filepath} file`

**Parameters:** `{duration}` (A duration in seconds or minutes, e.g. `5s` or `2m`), `{word}` (one word, no spaces), `{filepath}` (A file of the project, without whitespace: a path relative to the `resources` directories or to the directory of axx.yaml, or an absolute path. Editors link it to the file)

**Example:**

```gherkin
Then the disputes/kestrel-2026-09.csv object in the carrier-drops s3 bucket is identical to the expected/kestrel-disputes.csv file
```

_Since 0.1.0._

## `aws-s3.properties`

```gherkin
Then [[within {duration} ]]the {word} object in the {word} s3 bucket has the following properties:
  | ... | ... |
```

Wait (10s, or the given time) until the object exists and its JSON content has the properties: `path | value` rows compared as text, `null` for null and `undefined` for absent, as in the other JSON property steps.

**Variants** (optional parts in `[[...]]` above):

- `the {word} object in the {word} s3 bucket has the following properties:`
- `within {duration} the {word} object in the {word} s3 bucket has the following properties:`

**Parameters:** `{duration}` (A duration in seconds or minutes, e.g. `5s` or `2m`), `{word}` (one word, no spaces)

**Example:**

```gherkin
Then the summaries/kestrel-2026-09.json object in the carrier-drops s3 bucket has the following properties:
```

_Since 0.1.0._
