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 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, #type

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.



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

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 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



92
93
94
# File 'lib/cucumber/messages/attachment.rb', line 92

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



87
88
89
# File 'lib/cucumber/messages/attachment.rb', line 87

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



97
98
99
# File 'lib/cucumber/messages/attachment.rb', line 97

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.

Deprecated; use ExternalAttachment instead.



82
83
84
# File 'lib/cucumber/messages/attachment.rb', line 82

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... ...>


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

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