Class: Cucumber::Messages::Attachment

Inherits:
Message
  • Object
show all
Defined in:
lib/cucumber/messages/attachment.rb

Overview

Represents the Attachment message in Cucumber’s message protocol.

Attachments (parse errors, execution errors, screenshots, links…)

An attachment represents any kind of data associated with a line in a [Source](#io.cucumber.messages.Source) file. It can be used for:

  • Syntax errors during parse time

  • Screenshots captured and attached during execution

  • Logs captured and attached during execution

It is not to be used for runtime errors raised/thrown during execution. This is captured in ‘TestResult`.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Message

camelize, from_json, #to_h, #to_json

Constructor Details

#initialize(body: '', content_encoding: AttachmentContentEncoding::IDENTITY, file_name: nil, media_type: '', source: nil, test_case_started_id: nil, test_step_id: nil, url: nil, test_run_started_id: nil, test_run_hook_started_id: nil, timestamp: nil) ⇒ Attachment

Returns a new instance of Attachment.



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/cucumber/messages/attachment.rb', line 97

def initialize(
  body: '',
  content_encoding: AttachmentContentEncoding::IDENTITY,
  file_name: nil,
  media_type: '',
  source: nil,
  test_case_started_id: nil,
  test_step_id: nil,
  url: nil,
  test_run_started_id: nil,
  test_run_hook_started_id: nil,
  timestamp: nil
)
  @body = body
  @content_encoding = content_encoding
  @file_name = file_name
  @media_type = media_type
  @source = source
  @test_case_started_id = test_case_started_id
  @test_step_id = test_step_id
  @url = url
  @test_run_started_id = test_run_started_id
  @test_run_hook_started_id = test_run_hook_started_id
  @timestamp = timestamp
  super()
end

Instance Attribute Details

#bodyObject (readonly)

The body of the attachment. If ‘contentEncoding` is `IDENTITY`, the attachment is simply the string. If it’s ‘BASE64`, the string should be Base64 decoded to obtain the attachment.



28
29
30
# File 'lib/cucumber/messages/attachment.rb', line 28

def body
  @body
end

#content_encodingObject (readonly)

Whether to interpret ‘body` “as-is” (IDENTITY) or if it needs to be Base64-decoded (BASE64).

Content encoding is not determined by the media type, but rather by the type of the object being attached:

  • string: IDENTITY

  • byte array: BASE64

  • stream: BASE64



40
41
42
# File 'lib/cucumber/messages/attachment.rb', line 40

def content_encoding
  @content_encoding
end

#file_nameObject (readonly)

Suggested file name of the attachment. (Provided by the user as an argument to ‘attach`)



45
46
47
# File 'lib/cucumber/messages/attachment.rb', line 45

def file_name
  @file_name
end

#media_typeObject (readonly)

The media type of the data. This can be any valid [IANA Media Type](www.iana.org/assignments/media-types/media-types.xhtml) as well as Cucumber-specific media types such as ‘text/x.cucumber.gherkin+plain` and `text/x.cucumber.stacktrace+plain`



53
54
55
# File 'lib/cucumber/messages/attachment.rb', line 53

def media_type
  @media_type
end

#sourceObject (readonly)

Returns the value of attribute source.



55
56
57
# File 'lib/cucumber/messages/attachment.rb', line 55

def source
  @source
end

#test_case_started_idObject (readonly)

The identifier of the test case attempt if the attachment was created during the execution of a test step



60
61
62
# File 'lib/cucumber/messages/attachment.rb', line 60

def test_case_started_id
  @test_case_started_id
end

#test_run_hook_started_idObject (readonly)

The identifier of the test run hook execution if the attachment was created during the execution of a test run hook



90
91
92
# File 'lib/cucumber/messages/attachment.rb', line 90

def test_run_hook_started_id
  @test_run_hook_started_id
end

#test_run_started_idObject (readonly)

Not used; implementers should instead populate ‘testRunHookStartedId` if an attachment was created during the execution of a test run hook



85
86
87
# File 'lib/cucumber/messages/attachment.rb', line 85

def test_run_started_id
  @test_run_started_id
end

#test_step_idObject (readonly)

The identifier of the test step if the attachment was created during the execution of a test step



65
66
67
# File 'lib/cucumber/messages/attachment.rb', line 65

def test_step_id
  @test_step_id
end

#timestampObject (readonly)

When the attachment was created



95
96
97
# File 'lib/cucumber/messages/attachment.rb', line 95

def timestamp
  @timestamp
end

#urlObject (readonly)

A URL where the attachment can be retrieved. This field should not be set by Cucumber. It should be set by a program that reads a message stream and does the following for each Attachment message:

  • Writes the body (after base64 decoding if necessary) to a new file.

  • Sets ‘body` and `contentEncoding` to `null`

  • Writes out the new attachment message

This will result in a smaller message stream, which can improve performance and reduce bandwidth of message consumers. It also makes it easier to process and download attachments separately from reports.



80
81
82
# File 'lib/cucumber/messages/attachment.rb', line 80

def url
  @url
end

Class Method Details

.from_h(hash) ⇒ Object

Returns a new Attachment from the given hash. If the hash keys are camelCased, they are properly assigned to the corresponding snake_cased attributes.

Cucumber::Messages::Attachment.from_h(some_hash) # => #<Cucumber::Messages::Attachment:0x... ...>


131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/cucumber/messages/attachment.rb', line 131

def self.from_h(hash)
  return nil if hash.nil?

  new(
    body: hash[:body],
    content_encoding: hash[:contentEncoding],
    file_name: hash[:fileName],
    media_type: hash[:mediaType],
    source: Source.from_h(hash[:source]),
    test_case_started_id: hash[:testCaseStartedId],
    test_step_id: hash[:testStepId],
    url: hash[:url],
    test_run_started_id: hash[:testRunStartedId],
    test_run_hook_started_id: hash[:testRunHookStartedId],
    timestamp: Timestamp.from_h(hash[:timestamp])
  )
end