esp_sdk 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +5 -3
- data/Guardfile +3 -1
- data/esp_sdk.gemspec +2 -1
- data/lib/esp/aws_clients.rb +2 -1
- data/lib/esp/commands/commands_tasks.rb +2 -1
- data/lib/esp/commands/console.rb +4 -0
- data/lib/esp/exceptions.rb +1 -0
- data/lib/esp/extensions/active_resource/dirty.rb +51 -0
- data/lib/esp/extensions/active_resource/formats/json_api_format.rb +5 -3
- data/lib/esp/extensions/active_resource/paginated_collection.rb +71 -38
- data/lib/esp/extensions/active_resource/validations.rb +4 -2
- data/lib/esp/external_account_creator.rb +4 -1
- data/lib/esp/resources/alert.rb +53 -42
- data/lib/esp/resources/cloud_trail_event.rb +18 -12
- data/lib/esp/resources/concerns/stat_totals.rb +70 -67
- data/lib/esp/resources/contact_request.rb +17 -14
- data/lib/esp/resources/custom_signature/definition.rb +46 -51
- data/lib/esp/resources/custom_signature/result/alert.rb +13 -5
- data/lib/esp/resources/custom_signature/result.rb +49 -53
- data/lib/esp/resources/custom_signature.rb +52 -61
- data/lib/esp/resources/dashboard.rb +11 -5
- data/lib/esp/resources/external_account.rb +59 -58
- data/lib/esp/resources/metadata.rb +21 -11
- data/lib/esp/resources/organization.rb +49 -39
- data/lib/esp/resources/region.rb +25 -28
- data/lib/esp/resources/report.rb +46 -44
- data/lib/esp/resources/reports/export/integration.rb +22 -13
- data/lib/esp/resources/resource.rb +4 -3
- data/lib/esp/resources/scan_interval.rb +19 -13
- data/lib/esp/resources/service.rb +17 -11
- data/lib/esp/resources/signature.rb +43 -53
- data/lib/esp/resources/stat.rb +72 -55
- data/lib/esp/resources/stat_custom_signature.rb +73 -65
- data/lib/esp/resources/stat_region.rb +76 -65
- data/lib/esp/resources/stat_service.rb +76 -65
- data/lib/esp/resources/stat_signature.rb +76 -65
- data/lib/esp/resources/sub_organization.rb +51 -60
- data/lib/esp/resources/suppression/region.rb +35 -30
- data/lib/esp/resources/suppression/signature.rb +35 -29
- data/lib/esp/resources/suppression/unique_identifier.rb +27 -22
- data/lib/esp/resources/suppression.rb +45 -34
- data/lib/esp/resources/tag.rb +20 -11
- data/lib/esp/resources/team.rb +56 -58
- data/lib/esp/resources/user.rb +35 -32
- data/lib/esp/version.rb +1 -1
- data/lib/esp.rb +39 -16
- data/lib/esp_sdk.rb +1 -0
- data/test/esp/extensions/active_resource/dirty_test.rb +81 -0
- data/test/esp/extensions/active_resource/formats/json_api_format_test.rb +8 -0
- data/test/esp/extensions/active_resource/paginated_collection_test.rb +7 -0
- data/test/esp/integration/json_api_format_integration_test.rb +5 -2
- data/test/esp/integration/organization_integration_test.rb +1 -1
- data/test/esp/resources/custom_signature_test.rb +15 -0
- data/test/factories/custom_signatures.rb +0 -10
- metadata +21 -3
data/lib/esp/resources/tag.rb
CHANGED
@@ -1,28 +1,33 @@
|
|
1
1
|
module ESP
|
2
2
|
class Tag < ESP::Resource
|
3
3
|
# Not Implemented. You cannot create or update a Tag.
|
4
|
+
#
|
5
|
+
# @return [void]
|
4
6
|
def save
|
5
7
|
fail ESP::NotImplementedError
|
6
8
|
end
|
7
9
|
|
8
10
|
# Not Implemented. You cannot destroy a Tag.
|
11
|
+
#
|
12
|
+
# @return [void]
|
9
13
|
def destroy
|
10
14
|
fail ESP::NotImplementedError
|
11
15
|
end
|
12
16
|
|
13
17
|
# Not Implemented. You cannot search for a Tag.
|
18
|
+
#
|
19
|
+
# @return [void]
|
14
20
|
def self.where(*)
|
15
21
|
fail ESP::NotImplementedError
|
16
22
|
end
|
17
23
|
|
18
24
|
# Returns a paginated collection of tags for the given alert_id
|
19
|
-
# Convenience method to use instead of
|
25
|
+
# Convenience method to use instead of {.find} since an alert_id is required to return tags.
|
20
26
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# ==== Example
|
27
|
+
# @param alert_id [Integer, Numeric] Required ID of the alert to list tags for.
|
28
|
+
# @return [ActiveResource::PaginatedCollection<ESP::Tag>]
|
29
|
+
# @raise [ArgumentError] if no +alert_id+ is supplied.
|
30
|
+
# @example
|
26
31
|
# alerts = ESP::Tag.for_alert(1194)
|
27
32
|
def self.for_alert(alert_id = nil)
|
28
33
|
fail ArgumentError, "You must supply an alert id." unless alert_id.present?
|
@@ -32,12 +37,16 @@ module ESP
|
|
32
37
|
|
33
38
|
# Find a Tag by id
|
34
39
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# +id+ | Required | The ID of the tag to retrieve
|
40
|
+
# *call-seq* -> +super.find(id)+
|
38
41
|
#
|
39
|
-
#
|
40
|
-
#
|
42
|
+
# @overload find(id)
|
43
|
+
# @param id [Integer, Numeric] Required ID of the tag to retrieve.
|
44
|
+
# @overload find(scope, options)
|
45
|
+
# *call-seq* -> +super.all(options)+
|
46
|
+
# @api private
|
47
|
+
# @param scope [Object] *Example:* +:all+
|
48
|
+
# @param options [Hash] +params: { alert_id: Integer }+
|
49
|
+
# @raise [ArgumentError] if no +alert_id+ is supplied.
|
41
50
|
def self.find(*arguments)
|
42
51
|
scope = arguments.slice!(0)
|
43
52
|
options = (arguments.slice!(0) || {}).with_indifferent_access
|
data/lib/esp/resources/team.rb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
1
|
module ESP
|
2
2
|
class Team < ESP::Resource
|
3
|
-
##
|
4
3
|
# The organization this team belongs to.
|
4
|
+
#
|
5
|
+
# @return [ESP::Organization]
|
5
6
|
belongs_to :organization, class_name: 'ESP::Organization'
|
6
7
|
|
7
|
-
##
|
8
8
|
# The sub organization this team belongs to.
|
9
|
+
#
|
10
|
+
# @return [ESP::SubOrganization]
|
9
11
|
belongs_to :sub_organization, class_name: 'ESP::SubOrganization'
|
10
12
|
|
11
|
-
##
|
12
13
|
# The collection of external_accounts that belong to the team.
|
14
|
+
#
|
15
|
+
# @return [ActiveResource::PaginatedCollection<ESP::ExternalAccount>]
|
13
16
|
has_many :external_accounts, class_name: 'ESP::ExternalAccount'
|
14
17
|
|
15
|
-
##
|
16
18
|
# The collection of reports that belong to the team.
|
19
|
+
#
|
20
|
+
# @return [ActiveResource::PaginatedCollection<ESP::Report>]
|
17
21
|
has_many :reports, class_name: 'ESP::Report'
|
18
22
|
|
19
|
-
##
|
20
23
|
# The collection of custom_signatures that belong to the team.
|
24
|
+
#
|
25
|
+
# @return [ActiveResource::PaginatedCollection<ESP::CustomSignature>]
|
21
26
|
def custom_signatures
|
22
27
|
CustomSignature.where(teams_id_eq: id)
|
23
28
|
end
|
@@ -28,82 +33,75 @@ module ESP
|
|
28
33
|
# ESP::Report.find(<id>)
|
29
34
|
# until status is 'complete'.
|
30
35
|
# If not successful, returns a Report object with the errors object populated.
|
36
|
+
#
|
37
|
+
# @return [ESP::Report]
|
31
38
|
def create_report
|
32
39
|
Report.create_for_team(id)
|
33
40
|
end
|
34
41
|
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# ==== Parameters
|
42
|
+
# @!method self.where(clauses = {})
|
43
|
+
# Return a paginated Team list filtered by search parameters
|
39
44
|
#
|
40
|
-
# +clauses
|
45
|
+
# *call-seq* -> +super.where(clauses = {})+
|
41
46
|
#
|
42
|
-
#
|
47
|
+
# @param clauses [Hash] A hash of attributes with appended predicates to search, sort and include.
|
48
|
+
# ===== Valid Clauses
|
43
49
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
# :call-seq:
|
47
|
-
# where(clauses = {})
|
50
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-attributes] for valid arguments
|
51
|
+
# @return [ActiveResource::PaginatedCollection<ESP::Team>]
|
48
52
|
|
49
|
-
|
50
|
-
#
|
51
|
-
# Find a Team by id
|
52
|
-
#
|
53
|
-
# ==== Parameter
|
53
|
+
# @!method self.find(id, options = {})
|
54
|
+
# Find a Team by id
|
54
55
|
#
|
55
|
-
# +id
|
56
|
+
# *call-seq* -> +super.find(id, options = {})+
|
56
57
|
#
|
57
|
-
#
|
58
|
+
# @param id [Integer, Numeric, #to_i] Required ID of the team to retrieve.
|
59
|
+
# @param options [Hash] Optional hash of options.
|
60
|
+
# ===== Valid Options
|
58
61
|
#
|
59
|
-
#
|
62
|
+
# +include+ | The list of associated objects to return on the initial request.
|
60
63
|
#
|
61
|
-
#
|
64
|
+
# ===== Valid Includable Associations
|
62
65
|
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
# See {API documentation}[http://api-docs.evident.io?ruby#team-attributes] for valid arguments
|
66
|
-
#
|
67
|
-
# :call-seq:
|
68
|
-
# find(id, options = {})
|
69
|
-
|
70
|
-
# :singleton-method: all
|
71
|
-
# Return a paginated Team list
|
66
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-attributes] for valid arguments
|
67
|
+
# @return [ESP::Team]
|
72
68
|
|
73
|
-
#
|
74
|
-
#
|
75
|
-
# :call-seq:
|
76
|
-
# create(attributes={})
|
77
|
-
#
|
78
|
-
# ==== Parameter
|
79
|
-
#
|
80
|
-
# +attributes+ | Required | A hash of team attributes
|
69
|
+
# @!method self.all
|
70
|
+
# Return a paginated Team list
|
81
71
|
#
|
82
|
-
#
|
83
|
-
|
84
|
-
#
|
72
|
+
# @return [ActiveResource::PaginatedCollection<ESP::Team>]
|
73
|
+
|
74
|
+
# @!method self.create(attributes = {})
|
75
|
+
# Create a Team.
|
76
|
+
# *call-seq* -> +super.create(attributes={})+
|
85
77
|
#
|
86
|
-
#
|
78
|
+
# @param attributes [Hash] Required hash of team attributes.
|
79
|
+
# ===== Valid Attributes
|
87
80
|
#
|
88
|
-
#
|
81
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-create] for valid arguments
|
82
|
+
# @return [ESP::Team]
|
83
|
+
# @example
|
84
|
+
# team = ESP::Team.create(name: "Team Name", sub_organization_id: 9)
|
89
85
|
|
90
|
-
#
|
91
|
-
#
|
86
|
+
# @!method save
|
87
|
+
# Create and update a Team.
|
92
88
|
#
|
93
|
-
#
|
89
|
+
# ===== Valid Attributes when updating
|
94
90
|
#
|
95
|
-
#
|
91
|
+
# +name+ | Required | The new name of the team
|
96
92
|
#
|
97
|
-
#
|
93
|
+
# ===== Valid Attributes when creating
|
98
94
|
#
|
99
|
-
#
|
95
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#team-create] for valid arguments
|
100
96
|
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
97
|
+
# @return [Boolean]
|
98
|
+
# @example
|
99
|
+
# team = ESP::Team.new(name: "Team Name", sub_organization_id: 9)
|
100
|
+
# team.save
|
105
101
|
|
106
|
-
#
|
107
|
-
#
|
102
|
+
# @!method destroy
|
103
|
+
# Delete a Team.
|
104
|
+
#
|
105
|
+
# @return [self]
|
108
106
|
end
|
109
107
|
end
|
data/lib/esp/resources/user.rb
CHANGED
@@ -1,72 +1,75 @@
|
|
1
1
|
module ESP
|
2
2
|
class User < ESP::Resource
|
3
|
-
##
|
4
3
|
# The organization this user belongs to.
|
4
|
+
#
|
5
|
+
# @return [ESP::Organization]
|
5
6
|
belongs_to :organization, class_name: 'ESP::Organization'
|
6
7
|
|
7
8
|
# Not Implemented. You cannot create or update a User.
|
9
|
+
#
|
10
|
+
# @return [void]
|
8
11
|
def save
|
9
12
|
fail ESP::NotImplementedError
|
10
13
|
end
|
11
14
|
|
12
15
|
# Not Implemented. You cannot destroy a User.
|
16
|
+
#
|
17
|
+
# @return [void]
|
13
18
|
def destroy
|
14
19
|
fail ESP::NotImplementedError
|
15
20
|
end
|
16
21
|
|
17
|
-
##
|
18
22
|
# The collection of sub organizations that belong to the user.
|
23
|
+
#
|
24
|
+
# @return [ActiveResource::PaginatedCollection<ESP::SubOrganization>]
|
19
25
|
def sub_organizations
|
20
26
|
return attributes['sub_organizations'] if attributes['sub_organizations'].present?
|
21
27
|
SubOrganization.where(id_in: sub_organization_ids)
|
22
28
|
end
|
23
29
|
|
24
|
-
##
|
25
30
|
# The collection of teams that belong to the user.
|
31
|
+
#
|
32
|
+
# @return [ActiveResource::PaginatedCollection<ESP::Team>]
|
26
33
|
def teams
|
27
34
|
return attributes['teams'] if attributes['teams'].present?
|
28
35
|
Team.where(id_in: team_ids)
|
29
36
|
end
|
30
37
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
# ==== Parameters
|
38
|
+
# @!method self.where(clauses = {})
|
39
|
+
# Return a paginated User list filtered by search parameters
|
35
40
|
#
|
36
|
-
# +clauses
|
41
|
+
# *call-seq* -> +super.where(clauses = {})+
|
37
42
|
#
|
38
|
-
#
|
43
|
+
# @param clauses [Hash] A hash of attributes with appended predicates to search, sort and include.
|
44
|
+
# ===== Valid Clauses
|
39
45
|
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
# :call-seq:
|
43
|
-
# where(clauses = {})
|
46
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#user-attributes] for valid arguments
|
47
|
+
# @return [ActiveResource::PaginatedCollection<ESP::User>]
|
44
48
|
|
45
|
-
|
46
|
-
#
|
47
|
-
# Find a User by id
|
48
|
-
#
|
49
|
-
# ==== Parameter
|
50
|
-
#
|
51
|
-
# +id+ | Required | The ID of the user to retrieve
|
49
|
+
# @!method self.find(id, options = {})
|
50
|
+
# Find a User by id
|
52
51
|
#
|
53
|
-
# +options
|
52
|
+
# *call-seq* -> +super.find(id, options = {})+
|
54
53
|
#
|
55
|
-
#
|
54
|
+
# @param id [Integer, Numeric, #to_i] Required ID of the user to retrieve.
|
55
|
+
# @param options [Hash] Optional hash of options.
|
56
|
+
# ===== Valid Options
|
56
57
|
#
|
57
|
-
#
|
58
|
+
# +include+ | The list of associated objects to return on the initial request.
|
58
59
|
#
|
59
|
-
#
|
60
|
+
# ===== Valid Includable Associations
|
60
61
|
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
# :call-seq:
|
64
|
-
# find(id, options = {})
|
62
|
+
# See {API documentation}[http://api-docs.evident.io?ruby#user-attributes] for valid arguments
|
63
|
+
# @return [ESP::User]
|
65
64
|
|
66
|
-
#
|
67
|
-
#
|
65
|
+
# @!method self.all
|
66
|
+
# Return a paginated User list
|
67
|
+
#
|
68
|
+
# @return [ActiveResource::PaginatedCollection<ESP::User>]
|
68
69
|
|
69
|
-
#
|
70
|
-
#
|
70
|
+
# @!method self.create
|
71
|
+
# Not Implemented. You cannot create a User.
|
72
|
+
#
|
73
|
+
# @return [void]
|
71
74
|
end
|
72
75
|
end
|
data/lib/esp/version.rb
CHANGED
data/lib/esp.rb
CHANGED
@@ -1,71 +1,92 @@
|
|
1
1
|
module ESP
|
2
2
|
# Manually set the access_key_id you created from https://esp.evident.io/settings/api_keys.
|
3
3
|
#
|
4
|
-
# You can optionally set the
|
4
|
+
# You can optionally set the +ESP_ACCESS_KEY_ID+ environment variable.
|
5
|
+
#
|
6
|
+
# @param access_key_id [String] Your access key ID.
|
7
|
+
# @return [void]
|
5
8
|
def self.access_key_id=(access_key_id)
|
6
9
|
@access_key_id = access_key_id
|
7
10
|
ESP::Resource.hmac_access_id = access_key_id
|
8
11
|
end
|
9
12
|
|
10
|
-
# Reads the
|
13
|
+
# Reads the +ESP_ACCESS_KEY_ID+ environment variable if {.access_key_id=} was not set manually.
|
14
|
+
#
|
15
|
+
# Returns nil if no key or environment variable has been set.
|
16
|
+
#
|
17
|
+
# @return [String, nil]
|
11
18
|
def self.access_key_id
|
12
19
|
@access_key_id || ENV['ESP_ACCESS_KEY_ID']
|
13
20
|
end
|
14
21
|
|
15
22
|
# Manually set the secret_access_key you created from https://esp.evident.io/settings/api_keys.
|
16
23
|
#
|
17
|
-
# You can optionally set the
|
24
|
+
# You can optionally set the +ESP_SECRET_ACCESS_KEY+ environment variable.
|
25
|
+
#
|
26
|
+
# @param secret_access_key [String] Your secret access key.
|
27
|
+
# @return [void]
|
18
28
|
def self.secret_access_key=(secret_access_key)
|
19
29
|
@secret_access_key = secret_access_key
|
20
30
|
ESP::Resource.hmac_secret_key = secret_access_key
|
21
31
|
end
|
22
32
|
|
23
|
-
# Reads the
|
33
|
+
# Reads the +ESP_SECRET_ACCESS_KEY+ environment variable if {.secret_access_key=} was not set manually.
|
34
|
+
#
|
35
|
+
# Returns nil if no key or environment variable has been set.
|
36
|
+
#
|
37
|
+
# @return [String, nil]
|
24
38
|
def self.secret_access_key
|
25
39
|
@secret_access_key || ENV['ESP_SECRET_ACCESS_KEY']
|
26
40
|
end
|
27
41
|
|
28
42
|
PATH = '/api/v2'.freeze
|
29
43
|
|
44
|
+
# @private
|
30
45
|
HOST = { development: "http://localhost:3000".freeze,
|
31
46
|
test: "http://localhost:3000".freeze,
|
32
|
-
production: "https://api.evident.io".freeze }.freeze
|
47
|
+
production: "https://api.evident.io".freeze }.freeze
|
33
48
|
|
34
49
|
# Users of the Evident.io marketplace appliance application will need to set the host for their instance.
|
35
50
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# * +host+ - The host for the installed appliance instance.
|
51
|
+
# @param host [String] The host for the installed appliance instance.
|
52
|
+
# @return [void]
|
39
53
|
def self.host=(host)
|
40
54
|
@host = host
|
41
55
|
ESP::Resource.site = site
|
42
56
|
end
|
43
57
|
|
44
58
|
# The site the SDK will hit.
|
59
|
+
#
|
60
|
+
# @return [String]
|
45
61
|
def self.site
|
46
62
|
"#{(@host || HOST[ESP.env.to_sym] || ENV['ESP_HOST'])}#{PATH}"
|
47
63
|
end
|
48
64
|
|
49
65
|
# Manually set an http_proxy
|
50
66
|
#
|
51
|
-
# You can optionally set the
|
52
|
-
#
|
53
|
-
# ==== Attribute
|
67
|
+
# You can optionally set the +HTTP_PROXY+ environment variable.
|
54
68
|
#
|
55
|
-
#
|
69
|
+
# @param proxy [String] The URI of the http proxy
|
70
|
+
# @return [void]
|
56
71
|
def self.http_proxy=(proxy)
|
57
72
|
@http_proxy = proxy
|
58
73
|
ESP::Resource.proxy = http_proxy
|
59
74
|
end
|
60
75
|
|
61
|
-
# Reads the
|
76
|
+
# Reads the +HTTP_PROXY+ environment variable if {.http_proxy=} was not set manually.
|
77
|
+
#
|
78
|
+
# Returns nil if no proxy or environment variable has been set.
|
79
|
+
#
|
80
|
+
# @return [String, nil]
|
62
81
|
def self.http_proxy
|
63
82
|
@http_proxy || ENV['http_proxy']
|
64
83
|
end
|
65
84
|
|
66
|
-
# For use in a Rails initializer to set the
|
85
|
+
# For use in a Rails initializer to set the {.access_key_id=}, {.secret_access_key=} and {.site}.
|
67
86
|
#
|
68
|
-
#
|
87
|
+
# @yield [self]
|
88
|
+
# @return [void]
|
89
|
+
# @example
|
69
90
|
#
|
70
91
|
# ESP.configure do |config|
|
71
92
|
# config.access_key_id = <your key>
|
@@ -77,7 +98,9 @@ module ESP
|
|
77
98
|
yield self
|
78
99
|
end
|
79
100
|
|
80
|
-
# Default environment is production which will set
|
101
|
+
# Default environment is production which will set {.site} to "https://api.evident.io/api/v2".
|
102
|
+
#
|
103
|
+
# @return [String]
|
81
104
|
def self.env
|
82
105
|
@env ||= ActiveSupport::StringInquirer.new(ENV['ESP_ENV'] || ENV['RAILS_ENV'] || 'production')
|
83
106
|
end
|
data/lib/esp_sdk.rb
CHANGED
@@ -3,6 +3,7 @@ require 'active_resource'
|
|
3
3
|
require 'api_auth'
|
4
4
|
require_relative 'esp/extensions/active_resource/paginated_collection'
|
5
5
|
require_relative 'esp/extensions/active_resource/validations'
|
6
|
+
require_relative 'esp/extensions/active_resource/dirty'
|
6
7
|
require_relative 'esp/extensions/active_resource/formats/json_api_format'
|
7
8
|
require_relative 'esp/version'
|
8
9
|
require_relative 'esp/exceptions'
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../test_helper')
|
2
|
+
|
3
|
+
module ActiveResource
|
4
|
+
class DirtyTest < ActiveSupport::TestCase
|
5
|
+
context Dirty do
|
6
|
+
context 'changed_attributes' do
|
7
|
+
context 'for new record' do
|
8
|
+
context '#create' do
|
9
|
+
should 'pass all attributes to API and reset changed_attributes' do
|
10
|
+
stub_request(:post, /custom_signatures.json/).to_return(body: json(:custom_signature, name: 'abc', description: '123'))
|
11
|
+
custom_signature = ESP::CustomSignature.create(name: 'abc', description: '123')
|
12
|
+
|
13
|
+
assert_requested :post, /custom_signatures.json/ do |request|
|
14
|
+
json = JSON.parse(request.body)
|
15
|
+
json['data']['attributes']['name'] == 'abc' &&
|
16
|
+
json['data']['attributes']['description'] == '123'
|
17
|
+
end
|
18
|
+
assert_equal({}, custom_signature.changed_attributes)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'save' do
|
23
|
+
should 'pass all attributes to API and reset changed_attributes' do
|
24
|
+
custom_signature = ESP::CustomSignature.new
|
25
|
+
custom_signature.name = 'abc'
|
26
|
+
custom_signature.description = '123'
|
27
|
+
stub_request(:post, /custom_signatures\.json/).to_return(body: json(:custom_signature, name: 'abc', description: '123'))
|
28
|
+
|
29
|
+
custom_signature.save
|
30
|
+
|
31
|
+
assert_requested :post, /custom_signatures.json/ do |request|
|
32
|
+
json = JSON.parse(request.body)
|
33
|
+
json['data']['attributes']['name'] == 'abc' &&
|
34
|
+
json['data']['attributes']['description'] == '123'
|
35
|
+
end
|
36
|
+
assert_equal({}, custom_signature.changed_attributes)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'for record from api' do
|
42
|
+
context 'save' do
|
43
|
+
should 'pass only changed attributes to API and reset changed_attributes' do
|
44
|
+
stub_request(:get, %r{custom_signatures/1.json}).to_return(body: json(:custom_signature, name: 'abc', description: '123'))
|
45
|
+
custom_signature = ESP::CustomSignature.find(1)
|
46
|
+
custom_signature.name = 'def'
|
47
|
+
custom_signature.description = '123'
|
48
|
+
stub_request(:put, %r{custom_signatures/#{custom_signature.id}.json}).to_return(body: custom_signature.to_json)
|
49
|
+
|
50
|
+
custom_signature.save
|
51
|
+
|
52
|
+
assert_requested :put, %r{custom_signatures/#{custom_signature.id}.json} do |request|
|
53
|
+
json = JSON.parse(request.body)
|
54
|
+
json['data']['attributes']['name'] == 'def' &&
|
55
|
+
json['data']['attributes'].exclude?(:description)
|
56
|
+
end
|
57
|
+
assert_equal({}, custom_signature.changed_attributes)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'update_attributes' do
|
62
|
+
should 'pass only changed attributes to API and reset changed_attributes' do
|
63
|
+
stub_request(:get, %r{custom_signatures/1.json}).to_return(body: json(:custom_signature, name: 'abc', description: '123'))
|
64
|
+
custom_signature = ESP::CustomSignature.find(1)
|
65
|
+
stub_request(:put, %r{custom_signatures/#{custom_signature.id}.json}).to_return(body: custom_signature.to_json)
|
66
|
+
|
67
|
+
custom_signature.update_attributes(name: 'def', description: '123')
|
68
|
+
|
69
|
+
assert_requested :put, %r{custom_signatures/#{custom_signature.id}.json} do |request|
|
70
|
+
json = JSON.parse(request.body)
|
71
|
+
json['data']['attributes']['name'] == 'def' &&
|
72
|
+
json['data']['attributes'].exclude?(:description)
|
73
|
+
end
|
74
|
+
assert_equal({}, custom_signature.changed_attributes)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -49,6 +49,14 @@ module ActiveResource
|
|
49
49
|
# nested objects too
|
50
50
|
assert_equal parsed_json['included'].detect { |e| e['type'] == 'external_accounts' }['relationships']['organization']['data']['id'], alert.external_account.organization_id
|
51
51
|
end
|
52
|
+
|
53
|
+
should 'not error with included nulls' do
|
54
|
+
manufactured_hash = JSON.parse(json_list(:alert, 1))
|
55
|
+
manufactured_hash['included'] << nil
|
56
|
+
stub_request(:put, %r{reports/1/alerts.json*}).to_return(body: manufactured_hash.to_json)
|
57
|
+
|
58
|
+
ESP::Alert.where(report_id: 1).first
|
59
|
+
end
|
52
60
|
end
|
53
61
|
end
|
54
62
|
end
|
@@ -119,6 +119,13 @@ module ActiveResource
|
|
119
119
|
assert_predicate req.uri.query, :blank? # It will only be called once to get the first page
|
120
120
|
end
|
121
121
|
end
|
122
|
+
|
123
|
+
should 'not error if no initial params were supplied' do
|
124
|
+
stub_request(:get, /reports.json*/).to_return(body: json_list(:report, 3, page: { number: 1, size: 2 }))
|
125
|
+
stub_request(:put, /reports.json*/).to_return(body: json_list(:report, 3, page: { number: 2, size: 2 }))
|
126
|
+
reports = ESP::Report.all
|
127
|
+
reports.next_page
|
128
|
+
end
|
122
129
|
end
|
123
130
|
|
124
131
|
context '#first_page!' do
|
@@ -11,12 +11,15 @@ module ESP::Integration
|
|
11
11
|
|
12
12
|
assert_not_nil alert.attributes['external_account']
|
13
13
|
assert_equal alert.external_account_id, alert.external_account.id
|
14
|
-
|
15
|
-
|
14
|
+
|
15
|
+
assert_nil alert.attributes['team']
|
16
16
|
assert_not_nil alert.external_account.attributes['team']
|
17
17
|
assert_equal alert.external_account.team_id, alert.external_account.team.id
|
18
|
+
|
19
|
+
assert_nil alert.attributes['organization']
|
18
20
|
assert_not_nil alert.external_account.team.attributes['organization']
|
19
21
|
assert_equal alert.external_account.team.organization_id, alert.external_account.team.organization.id
|
22
|
+
|
20
23
|
assert_not_nil alert.attributes['region']
|
21
24
|
assert_equal alert.region_id, alert.region.id
|
22
25
|
if alert.signature.present?
|
@@ -41,6 +41,21 @@ module ESP
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
context 'save' do
|
45
|
+
should 'should not send team_ids param if not changed' do
|
46
|
+
stub_request(:get, %r{custom_signatures/1.json}).to_return(body: json(:custom_signature))
|
47
|
+
custom_signature = ESP::CustomSignature.find(1)
|
48
|
+
stub_request(:put, %r{custom_signatures/#{custom_signature.id}.json})
|
49
|
+
|
50
|
+
custom_signature.save
|
51
|
+
|
52
|
+
assert_requested :put, %r{custom_signatures/#{custom_signature.id}.json} do |request|
|
53
|
+
json = JSON.parse(request.body)
|
54
|
+
json['data']['attributes'].exclude?('team_ids')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
44
59
|
context '#suppress' do
|
45
60
|
should 'call the api' do
|
46
61
|
stub_request(:post, %r{suppressions/signatures.json*}).to_return(body: json(:suppression_signature))
|
@@ -11,25 +11,15 @@ FactoryGirl.define do
|
|
11
11
|
name "Test"
|
12
12
|
resolution "Test resolution"
|
13
13
|
risk_level "Medium"
|
14
|
-
signature "Some javascript"
|
15
|
-
language "javascript"
|
16
14
|
updated_at nil
|
17
15
|
relationships do
|
18
16
|
{
|
19
17
|
organization: {
|
20
|
-
data: {
|
21
|
-
type: "organizations",
|
22
|
-
id: "1003"
|
23
|
-
},
|
24
18
|
links: {
|
25
19
|
related: "http://test.host/api/v2/organizations/1003.json"
|
26
20
|
}
|
27
21
|
},
|
28
22
|
teams: {
|
29
|
-
data: {
|
30
|
-
type: "teams",
|
31
|
-
id: "1003"
|
32
|
-
},
|
33
23
|
links: {
|
34
24
|
related: "http://test.host/api/v2/teams?filter%5Bcustom_signatures_id_eq%5D=#{id}"
|
35
25
|
}
|