brightbox-cli 5.0.0.alpha → 5.0.0.rc1

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -1
  3. data/CHANGELOG.md +60 -0
  4. data/Gemfile.lock +1 -1
  5. data/lib/brightbox-cli/accounts.rb +5 -1
  6. data/lib/brightbox-cli/api.rb +34 -1
  7. data/lib/brightbox-cli/cloud_ips.rb +6 -6
  8. data/lib/brightbox-cli/collaboration.rb +3 -7
  9. data/lib/brightbox-cli/commands/lbs/create.rb +0 -2
  10. data/lib/brightbox-cli/commands/lbs/show.rb +4 -0
  11. data/lib/brightbox-cli/config.rb +10 -4
  12. data/lib/brightbox-cli/database_server.rb +20 -20
  13. data/lib/brightbox-cli/database_snapshot.rb +5 -5
  14. data/lib/brightbox-cli/database_type.rb +4 -8
  15. data/lib/brightbox-cli/detailed_server.rb +26 -28
  16. data/lib/brightbox-cli/detailed_server_group.rb +2 -2
  17. data/lib/brightbox-cli/firewall_policy.rb +5 -9
  18. data/lib/brightbox-cli/firewall_rule.rb +14 -15
  19. data/lib/brightbox-cli/images.rb +22 -21
  20. data/lib/brightbox-cli/indifferent_access_hash.rb +50 -0
  21. data/lib/brightbox-cli/load_balancers.rb +27 -11
  22. data/lib/brightbox-cli/server_groups.rb +4 -8
  23. data/lib/brightbox-cli/servers.rb +22 -16
  24. data/lib/brightbox-cli/types.rb +4 -8
  25. data/lib/brightbox-cli/user_collaboration.rb +1 -1
  26. data/lib/brightbox-cli/users.rb +3 -5
  27. data/lib/brightbox-cli/version.rb +1 -1
  28. data/lib/brightbox-cli/volume.rb +9 -13
  29. data/lib/brightbox-cli/zones.rb +0 -4
  30. data/lib/brightbox_cli.rb +1 -0
  31. data/spec/commands/cloudips/update_spec.rb +7 -5
  32. data/spec/commands/configmaps/create_spec.rb +6 -6
  33. data/spec/commands/configmaps/destroy_spec.rb +1 -1
  34. data/spec/commands/configmaps/list_spec.rb +1 -1
  35. data/spec/commands/configmaps/show_spec.rb +3 -3
  36. data/spec/commands/configmaps/update_spec.rb +9 -9
  37. data/spec/commands/lbs/create_spec.rb +12 -26
  38. data/spec/commands/lbs/show_spec.rb +15 -3
  39. data/spec/commands/lbs/update_spec.rb +4 -4
  40. data/spec/commands/servers/update_spec.rb +7 -7
  41. data/spec/commands/sql/instances/create_spec.rb +8 -8
  42. data/spec/commands/sql/instances/reset_spec.rb +3 -3
  43. data/spec/commands/sql/instances/resize_spec.rb +4 -4
  44. data/spec/commands/sql/instances/show_spec.rb +2 -1
  45. data/spec/commands/sql/instances/update_spec.rb +3 -3
  46. data/spec/commands/sql/snapshots/list_spec.rb +1 -1
  47. data/spec/commands/sql/snapshots/show_spec.rb +50 -7
  48. data/spec/commands/volumes/attach_spec.rb +4 -4
  49. data/spec/commands/volumes/copy_spec.rb +2 -2
  50. data/spec/commands/volumes/destroy_spec.rb +1 -1
  51. data/spec/commands/volumes/detach_spec.rb +1 -1
  52. data/spec/commands/volumes/list_spec.rb +1 -1
  53. data/spec/commands/volumes/resize_spec.rb +3 -3
  54. data/spec/commands/volumes/show_spec.rb +1 -1
  55. data/spec/commands/volumes/update_spec.rb +4 -4
  56. data/spec/spec_helper.rb +14 -10
  57. data/spec/support/shared/api_resource_examples.rb +25 -0
  58. data/spec/unit/brightbox/account/attributes_spec.rb +13 -0
  59. data/spec/unit/brightbox/api/attributes_spec.rb +65 -0
  60. data/spec/unit/brightbox/api/fog_attributes_spec.rb +65 -0
  61. data/spec/unit/brightbox/cloud_ip/attributes_spec.rb +19 -0
  62. data/spec/unit/brightbox/collaborating_account/attributes_spec.rb +13 -0
  63. data/spec/unit/brightbox/database_server/attributes_spec.rb +13 -0
  64. data/spec/unit/brightbox/database_snapshot/attributes_spec.rb +13 -0
  65. data/spec/unit/brightbox/database_type/attributes_spec.rb +20 -0
  66. data/spec/unit/brightbox/detailed_server/attributes_spec.rb +29 -0
  67. data/spec/unit/brightbox/detailed_server_group/attributes_spec.rb +13 -0
  68. data/spec/unit/brightbox/firewall_policy/attributes_spec.rb +21 -0
  69. data/spec/unit/brightbox/firewall_rule/attributes_spec.rb +18 -0
  70. data/spec/unit/brightbox/image/attributes_spec.rb +13 -0
  71. data/spec/unit/brightbox/image/status_spec.rb +67 -0
  72. data/spec/unit/brightbox/load_balancer/acme_cert_spec.rb +75 -0
  73. data/spec/unit/brightbox/load_balancer/attributes_spec.rb +13 -0
  74. data/spec/unit/brightbox/load_balancer/formatted_acme_domains_spec.rb +78 -0
  75. data/spec/unit/brightbox/server/attributes_spec.rb +29 -0
  76. data/spec/unit/brightbox/server_group/attributes_spec.rb +13 -0
  77. data/spec/unit/brightbox/type/attributes_spec.rb +20 -0
  78. data/spec/unit/brightbox/user/attributes_spec.rb +13 -0
  79. data/spec/unit/brightbox/user_collaboration/attributes_spec.rb +13 -0
  80. metadata +47 -4
  81. data/spec/cassettes/brightbox_sql_snapshots/show/when_resource_exists/does_not_output_to_stderr.yml +0 -93
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Api, "#fog_attributes" do
4
+ subject(:model_attributes) { api_model.fog_attributes }
5
+
6
+ let(:api_model) { Brightbox::Api.new(fog_model) }
7
+ let(:fog_model) do
8
+ double(
9
+ "Fog::Compute::Brightbox::Api",
10
+ id: "res-12345",
11
+ attributes: attributes
12
+ )
13
+ end
14
+
15
+ context "when attributes are not set" do
16
+ let(:attributes) { nil }
17
+
18
+ it "returns an indifferent access hash" do
19
+ expect(model_attributes).to be_instance_of(IndifferentAccessHash)
20
+ end
21
+ end
22
+
23
+ context "when attributes are set with a mix of string and symbols" do
24
+ let(:attributes) do
25
+ {
26
+ id: "res-12345",
27
+ name: "test",
28
+ acme: acme_details
29
+ }
30
+ end
31
+ let(:acme_details) do
32
+ {
33
+ "domains" => [
34
+ {
35
+ "identifier" => "example.test",
36
+ "status" => "pending"
37
+ }
38
+ ]
39
+ }
40
+ end
41
+
42
+ it "transforms the keys with deep symbolize" do
43
+ expect(model_attributes).to eq(
44
+ id: "res-12345",
45
+ name: "test",
46
+ acme: {
47
+ domains: [
48
+ {
49
+ identifier: "example.test",
50
+ status: "pending"
51
+ }
52
+ ]
53
+ }
54
+ )
55
+ end
56
+
57
+ it "can not accessed by string keys" do
58
+ expect(model_attributes["acme"]["domains"].first["identifier"]).to eq("example.test")
59
+ end
60
+
61
+ it "can accessed by symbol keys" do
62
+ expect(model_attributes[:acme][:domains].first[:identifier]).to eq("example.test")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::CloudIP, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "cip-12345",
10
+ destination_id: nil,
11
+ attributes: model_attributes
12
+ )
13
+ end
14
+ let(:model_attributes) { { id: "cip-12345" } }
15
+
16
+ it "returns an IndifferentAccessHash" do
17
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::CollaboratingAccount, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::DatabaseServer, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::DatabaseSnapshot, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::DatabaseType, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "typ-12345",
10
+ attributes: model_attributes,
11
+ ram: 1024,
12
+ disk: 10_240,
13
+ )
14
+ end
15
+ let(:model_attributes) { { id: "typ-12345" } }
16
+
17
+ it "returns an IndifferentAccessHash" do
18
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::DetailedServer, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "srv-12345",
10
+ attributes: model_attributes,
11
+ cloud_ips: [],
12
+ created_at: Time.parse("2025-01-01T12:00:00Z"),
13
+ created_on: "2025-01-01",
14
+ hostname: "srv-12345.gb1.brightbox.com",
15
+ image_id: "img-12345",
16
+ interfaces: [],
17
+ locked?: false,
18
+ type: "typ-12345",
19
+ state: "active",
20
+ server_type: "typ-12345",
21
+ zone: { id: "zon-12345", handle: "gb1-a" }
22
+ )
23
+ end
24
+ let(:model_attributes) { { id: "srv-12345" } }
25
+
26
+ it "returns an IndifferentAccessHash" do
27
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::DetailedServerGroup, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::FirewallPolicy, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "res-12345",
10
+ attributes: model_attributes,
11
+ description: "",
12
+ server_group_id: "grp-12345",
13
+ name: "my-policy"
14
+ )
15
+ end
16
+ let(:model_attributes) { { id: "fwp-12345" } }
17
+
18
+ it "returns an IndifferentAccessHash" do
19
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::FirewallRule, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "fwr-12345",
10
+ attributes: model_attributes
11
+ )
12
+ end
13
+ let(:model_attributes) { { id: "fwr-12345" } }
14
+
15
+ it "returns an IndifferentAccessHash" do
16
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Image, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Image, "#status" do
4
+ subject(:image) { Brightbox::Image.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Compute::Brightbox::Image",
9
+ id: "img-12345",
10
+ attributes: {
11
+ "id": "img-12345",
12
+ "status": status,
13
+ "public": is_public
14
+ },
15
+ public: is_public
16
+ )
17
+ end
18
+ let(:is_public) { false }
19
+
20
+ context "when the image is pending" do
21
+ let(:status) { "pending" }
22
+
23
+ it "returns 'pending'" do
24
+ expect(image.status).to eq("pending")
25
+ end
26
+ end
27
+
28
+ context "when the image is available" do
29
+ let(:status) { "available" }
30
+
31
+ context "with public visibility" do
32
+ let(:is_public) { true }
33
+
34
+ it "returns 'public'" do
35
+ expect(image.status).to eq("public")
36
+ end
37
+ end
38
+
39
+ context "without public visibility" do
40
+ let(:is_public) { false }
41
+
42
+ it "returns 'private'" do
43
+ expect(image.status).to eq("private")
44
+ end
45
+ end
46
+ end
47
+
48
+ context "when the image is deprecated" do
49
+ let(:status) { "deprecated" }
50
+
51
+ context "with public visibility" do
52
+ let(:is_public) { true }
53
+
54
+ it "returns 'deprecated'" do
55
+ expect(image.status).to eq("deprecated")
56
+ end
57
+ end
58
+
59
+ context "without public visibility" do
60
+ let(:is_public) { false }
61
+
62
+ it "returns 'private'" do
63
+ expect(image.status).to eq("private")
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::LoadBalancer, "#acme_cert" do
4
+ subject(:acme_cert) { load_balancer.acme_cert }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Compute::Brightbox::LoadBalancer",
9
+ id: "lba-12345",
10
+ attributes: lba_attributes
11
+ )
12
+ end
13
+ let(:load_balancer) { Brightbox::LoadBalancer.new(fog_model) }
14
+
15
+ context "when ACME is not setup" do
16
+ let(:lba_attributes) { { acme: nil } }
17
+
18
+ it "returns an empty string" do
19
+ expect(acme_cert).not_to be_nil
20
+ end
21
+ end
22
+
23
+ context "when ACME is setup" do
24
+ context "without certificate" do
25
+ let(:lba_attributes) do
26
+ { acme: { certificate: nil }}
27
+ end
28
+
29
+ it "returns an object without keys" do
30
+ expect(acme_cert).not_to be_nil
31
+
32
+ expect(acme_cert).to have_attributes(
33
+ expires_at: "",
34
+ fingerprint: "",
35
+ issued_at: "",
36
+ subjects: ""
37
+ )
38
+ end
39
+ end
40
+
41
+ context "with certificate" do
42
+ let(:expected_formatting) { "example.com:verified,example.net:pending" }
43
+ let(:lba_attributes) do
44
+ {
45
+ acme: {
46
+ domains: [
47
+ { identifier: "domain.one.test", status: "verified" },
48
+ { identifier: "domain.two.test", status: "verified" }
49
+ ],
50
+ certificate: {
51
+ domains: [
52
+ "domain.one.test",
53
+ "domain.two.test"
54
+ ],
55
+ expires_at: "2025-12-31T23:59:59Z",
56
+ fingerprint: "TLS-fingerprint",
57
+ issued_at: "2025-01-01T00:00:00Z"
58
+ }
59
+ }
60
+ }
61
+ end
62
+
63
+ it "returns an object with the correct keys" do
64
+ expect(acme_cert).not_to be_nil
65
+
66
+ expect(acme_cert).to have_attributes(
67
+ expires_at: "2025-12-31T23:59:59Z",
68
+ fingerprint: "TLS-fingerprint",
69
+ issued_at: "2025-01-01T00:00:00Z",
70
+ subjects: "domain.one.test,domain.two.test"
71
+ )
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::LoadBalancer, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,78 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::LoadBalancer, "#formatted_acme_domains" do
4
+ subject(:load_balancer) { Brightbox::LoadBalancer.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Compute::Brightbox::LoadBalancer",
9
+ id: "lba-12345",
10
+ attributes: lba_attributes
11
+ )
12
+ end
13
+ let(:lba_attributes) do
14
+ # Encode/decode JSON to get final key/value forms
15
+ JSON.parse({
16
+ id: "lba-12345",
17
+ acme: acme_details
18
+ }.to_json)
19
+ end
20
+
21
+ context "when ACME is not setup" do
22
+ let(:acme_details) { nil }
23
+
24
+ it "returns an empty array" do
25
+ expect(load_balancer.formatted_acme_domains).to eq("")
26
+ end
27
+ end
28
+
29
+ context "when no domains are returned" do
30
+ let(:acme_details) do
31
+ { domains: [] }
32
+ end
33
+
34
+ it "returns an empty array" do
35
+ expect(load_balancer.formatted_acme_domains).to eq("")
36
+ end
37
+ end
38
+
39
+ context "when multiple domains are returned" do
40
+ let(:acme_details) do
41
+ {
42
+ domains: [
43
+ {
44
+ identifier: "example.com",
45
+ status: "verified"
46
+ },
47
+ {
48
+ identifier: "example.net",
49
+ status: "pending"
50
+ }
51
+ ]
52
+ }
53
+ end
54
+ let(:expected_formatting) do
55
+ "example.com:verified,example.net:pending"
56
+ end
57
+
58
+ it "returns a comma separated list of domains and statuses" do
59
+ expect(load_balancer.formatted_acme_domains).to eq(expected_formatting)
60
+ end
61
+ end
62
+
63
+ context "when error occurs" do
64
+ let(:lba_attributes) do
65
+ # Encode/decode JSON to get final key/value forms
66
+ JSON.parse({
67
+ id: "lba-12345",
68
+ acme: {
69
+ domains: nil
70
+ }
71
+ }.to_json)
72
+ end
73
+
74
+ it "returns an empty array" do
75
+ expect(load_balancer.formatted_acme_domains).to eq("")
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Server, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "srv-12345",
10
+ attributes: model_attributes,
11
+ cloud_ips: [],
12
+ created_at: Time.parse("2025-01-01T12:00:00Z"),
13
+ created_on: "2025-01-01",
14
+ hostname: "srv-12345.gb1.brightbox.com",
15
+ image_id: "img-12345",
16
+ interfaces: [],
17
+ locked?: false,
18
+ type: "typ-12345",
19
+ state: "active",
20
+ server_type: "typ-12345",
21
+ zone: { id: "zon-12345", handle: "gb1-a" }
22
+ )
23
+ end
24
+ let(:model_attributes) { { id: "srv-12345" } }
25
+
26
+ it "returns an IndifferentAccessHash" do
27
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::ServerGroup, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Type, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double(
8
+ "Fog::Model",
9
+ id: "typ-12345",
10
+ attributes: model_attributes,
11
+ ram: 1_024,
12
+ disk: 10_240
13
+ )
14
+ end
15
+ let(:model_attributes) { { id: "typ-12345" } }
16
+
17
+ it "returns an IndifferentAccessHash" do
18
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::User, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::UserCollaboration, "#attributes" do
4
+ subject { described_class.new(fog_model) }
5
+
6
+ let(:fog_model) do
7
+ double("Fog::Model", id: "res-12345", attributes: { id: "res-12345"})
8
+ end
9
+
10
+ it "returns an IndifferentAccessHash" do
11
+ expect(subject.attributes).to be_a(IndifferentAccessHash)
12
+ end
13
+ end