amorail 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,10 @@
1
- # Classes for Amorail Exceptions
1
+ # Amorail Exceptions.
2
2
  # Every class is name of HTTP response error code(status)
3
-
4
3
  module Amorail
5
4
  class Error < ::StandardError; end
6
5
 
7
6
  class APIError < Error; end
8
-
7
+
9
8
  class AmoBadRequestError < APIError; end
10
9
 
11
10
  class AmoMovedPermanentlyError < APIError; end
@@ -23,4 +22,4 @@ module Amorail
23
22
  class AmoServiceUnaviableError < APIError; end
24
23
 
25
24
  class AmoUnknownError < APIError; end
26
- end
25
+ end
@@ -1,8 +1,8 @@
1
1
  module Amorail
2
-
2
+ # Return hash key as method call
3
3
  module MethodMissing
4
4
  def method_missing(method_sym, *arguments, &block)
5
- if data.has_key?(method_sym.to_s)
5
+ if data.key?(method_sym.to_s)
6
6
  data.fetch(method_sym.to_s)
7
7
  else
8
8
  super
@@ -10,10 +10,22 @@ module Amorail
10
10
  end
11
11
  end
12
12
 
13
- class Property
13
+ class Property # :nodoc: all
14
14
  class PropertyItem
15
15
  include MethodMissing
16
16
 
17
+ class << self
18
+ attr_accessor :source_name
19
+
20
+ def parse(data)
21
+ hash = {}
22
+ data['custom_fields'][source_name].each do |contact|
23
+ hash[contact['code'].downcase] = PropertyItem.new(contact)
24
+ end
25
+ new hash
26
+ end
27
+ end
28
+
17
29
  attr_reader :data
18
30
 
19
31
  def initialize(data)
@@ -32,7 +44,7 @@ module Amorail
32
44
  @statuses = data
33
45
  end
34
46
  end
35
-
47
+
36
48
  attr_reader :client, :data, :contacts,
37
49
  :company, :leads, :tasks
38
50
 
@@ -45,9 +57,12 @@ module Amorail
45
57
  @data = load_fields
46
58
  parse_all_data
47
59
  end
48
-
60
+
49
61
  def load_fields
50
- response = client.safe_request(:get, '/private/api/v2/json/accounts/current')
62
+ response = client.safe_request(
63
+ :get,
64
+ '/private/api/v2/json/accounts/current'
65
+ )
51
66
  response.body["response"]["account"]
52
67
  end
53
68
 
@@ -65,23 +80,11 @@ module Amorail
65
80
  end
66
81
 
67
82
  class Contact < PropertyItem
68
- def self.parse(data)
69
- hash = {}
70
- data['custom_fields']['contacts'].each do |contact|
71
- hash[contact['code'].downcase] = PropertyItem.new(contact)
72
- end
73
- new hash
74
- end
83
+ self.source_name = 'contacts'
75
84
  end
76
85
 
77
86
  class Company < PropertyItem
78
- def self.parse(data)
79
- hash = {}
80
- data['custom_fields']['companies'].each do |company|
81
- hash[company['code'].downcase] = PropertyItem.new(company)
82
- end
83
- new hash
84
- end
87
+ self.source_name = 'companies'
85
88
  end
86
89
 
87
90
  class Lead < StatusItem
@@ -106,4 +109,4 @@ module Amorail
106
109
  end
107
110
  end
108
111
  end
109
- end
112
+ end
@@ -1,3 +1,4 @@
1
+ # Amorail version
1
2
  module Amorail
2
- VERSION = "0.1.4"
3
+ VERSION = "0.1.5"
3
4
  end
data/lib/amorail.rb CHANGED
@@ -3,12 +3,12 @@ require 'amorail/config'
3
3
  require 'amorail/client'
4
4
  require 'amorail/exceptions'
5
5
  require 'amorail/entity'
6
- require 'amorail/custom_fields'
7
-
8
- require 'amorail/entities/leadable'
6
+ require 'amorail/property'
9
7
 
10
8
  Gem.find_files('amorail/entities/*.rb').each { |path| require path }
11
9
 
10
+ # AmoCRM API integration.
11
+ # https://www.amocrm.com/
12
12
  module Amorail
13
13
  def self.config
14
14
  @config ||= Config.new
@@ -1,8 +1,8 @@
1
1
  require 'amorail'
2
2
 
3
3
  namespace :amorail do
4
- desc "Check Amorails configuration. Authorize and get custom fields information"
4
+ desc "Check Amorail configuration."
5
5
  task :check do
6
- p Amorail.properties
6
+ p Amorail.properties.inspect
7
7
  end
8
- end
8
+ end
data/spec/client_spec.rb CHANGED
@@ -20,4 +20,4 @@ describe Amorail::Client do
20
20
  res = client.get("/private/api/v2/json/accounts/current")
21
21
  expect(res.status).to eq 200
22
22
  end
23
- end
23
+ end
data/spec/company_spec.rb CHANGED
@@ -2,14 +2,28 @@ require "spec_helper"
2
2
 
3
3
  describe Amorail::AmoCompany do
4
4
  before { mock_api }
5
-
5
+
6
6
  describe "validations" do
7
7
  it { should validate_presence_of(:name) }
8
8
  end
9
9
 
10
+ describe ".attributes" do
11
+ subject { described_class.attributes }
12
+
13
+ it_behaves_like 'entity_class'
14
+
15
+ specify { is_expected.to include(:name) }
16
+ end
17
+
18
+ describe ".properties" do
19
+ subject { described_class.properties }
20
+
21
+ specify { is_expected.to include(:email, :phone, :web, :address) }
22
+ end
23
+
10
24
  describe "#params" do
11
25
  let(:company) do
12
- Amorail::AmoCompany.new(
26
+ described_class.new(
13
27
  name: 'Test inc',
14
28
  phone: '12345678',
15
29
  email: 'test@mala.ru',
@@ -20,6 +34,7 @@ describe Amorail::AmoCompany do
20
34
 
21
35
  subject { company.params }
22
36
 
37
+ specify { is_expected.to include(:last_modified) }
23
38
  specify { is_expected.to include(name: 'Test inc') }
24
39
  specify { is_expected.to include(type: 'contact') }
25
40
 
@@ -27,14 +42,16 @@ describe Amorail::AmoCompany do
27
42
  prop = subject[:custom_fields].detect { |p| p[:id] == "1460591" }
28
43
  expect(prop).not_to be_nil
29
44
  expect(prop[:values].first[:value]).to eq 'test@mala.ru'
30
- expect(prop[:values].first[:enum]).to eq 'WORK'
45
+ expect(prop[:values].first[:enum])
46
+ .to eq described_class.properties[:email][:enum]
31
47
  end
32
48
 
33
49
  it "contains phone property" do
34
50
  prop = subject[:custom_fields].detect { |p| p[:id] == "1460589" }
35
51
  expect(prop).not_to be_nil
36
52
  expect(prop[:values].first[:value]).to eq '12345678'
37
- expect(prop[:values].first[:enum]).to eq 'WORK'
53
+ expect(prop[:values].first[:enum])
54
+ .to eq described_class.properties[:phone][:enum]
38
55
  end
39
56
 
40
57
  it "contains address property" do
@@ -51,7 +68,7 @@ describe Amorail::AmoCompany do
51
68
  end
52
69
 
53
70
  describe "#save" do
54
- let(:company) { Amorail::AmoCompany.new(name: "test") }
71
+ let(:company) { described_class.new(name: "test") }
55
72
 
56
73
  before { company_create_stub(Amorail.config.api_endpoint) }
57
74
 
data/spec/contact_spec.rb CHANGED
@@ -3,15 +3,29 @@ require "spec_helper"
3
3
  describe Amorail::AmoContact do
4
4
  before { mock_api }
5
5
 
6
- let(:contact) { Amorail::AmoContact.new(name: "test") }
6
+ let(:contact) { described_class.new(name: "test") }
7
7
 
8
8
  describe "validations" do
9
- it { should validate_presence_of(:name)}
9
+ it { should validate_presence_of(:name) }
10
+ end
11
+
12
+ describe ".attributes" do
13
+ subject { described_class.attributes }
14
+
15
+ it_behaves_like 'entity_class'
16
+
17
+ specify { is_expected.to include(:name, :company_name) }
18
+ end
19
+
20
+ describe ".properties" do
21
+ subject { described_class.properties }
22
+
23
+ specify { is_expected.to include(:email, :phone, :position) }
10
24
  end
11
25
 
12
26
  describe "#params" do
13
27
  let(:contact) do
14
- Amorail::AmoContact.new(
28
+ described_class.new(
15
29
  name: 'Tester',
16
30
  company_name: 'Test inc',
17
31
  phone: '12345678',
@@ -22,6 +36,7 @@ describe Amorail::AmoContact do
22
36
 
23
37
  subject { contact.params }
24
38
 
39
+ specify { is_expected.to include(:last_modified) }
25
40
  specify { is_expected.to include(name: 'Tester') }
26
41
  specify { is_expected.to include(company_name: 'Test inc') }
27
42
 
@@ -29,14 +44,16 @@ describe Amorail::AmoContact do
29
44
  prop = subject[:custom_fields].detect { |p| p[:id] == "1460591" }
30
45
  expect(prop).not_to be_nil
31
46
  expect(prop[:values].first[:value]).to eq 'test@mala.ru'
32
- expect(prop[:values].first[:enum]).to eq 'MOB'
47
+ expect(prop[:values].first[:enum])
48
+ .to eq described_class.properties[:email][:enum]
33
49
  end
34
50
 
35
51
  it "contains phone property" do
36
52
  prop = subject[:custom_fields].detect { |p| p[:id] == "1460589" }
37
53
  expect(prop).not_to be_nil
38
54
  expect(prop[:values].first[:value]).to eq '12345678'
39
- expect(prop[:values].first[:enum]).to eq 'WORK'
55
+ expect(prop[:values].first[:enum])
56
+ .to eq described_class.properties[:phone][:enum]
40
57
  end
41
58
 
42
59
  it "contains position property" do
@@ -51,20 +68,21 @@ describe Amorail::AmoContact do
51
68
  before { contact_find_stub(Amorail.config.api_endpoint, 102, false) }
52
69
 
53
70
  it "loads entity" do
54
- obj = Amorail::AmoContact.find(101)
71
+ obj = described_class.find(101)
55
72
  expect(obj.id).to eq 101
56
73
  expect(obj.company_name).to eq "Foo Inc."
57
74
  expect(obj.email).to eq "foo@tb.com"
58
75
  expect(obj.phone).to eq "1111 111 111"
76
+ expect(obj.params[:id]).to eq 101
59
77
  end
60
78
 
61
79
  it "returns nil" do
62
- obj = Amorail::AmoContact.find(102)
80
+ obj = described_class.find(102)
63
81
  expect(obj).to be_falsey
64
82
  end
65
83
 
66
84
  it "raise error" do
67
- expect { Amorail::AmoContact.find!(102) }
85
+ expect { described_class.find!(102) }
68
86
  .to raise_error(Amorail::AmoEntity::RecordNotFound)
69
87
  end
70
88
  end
@@ -91,12 +109,12 @@ describe Amorail::AmoContact do
91
109
  end
92
110
 
93
111
  it "raise error if id is blank?" do
94
- obj = Amorail::AmoContact.new
112
+ obj = described_class.new
95
113
  expect { obj.update!(name: 'Igor') }.to raise_error
96
114
  end
97
115
 
98
116
  it "raise error" do
99
- obj = Amorail::AmoContact.new
117
+ obj = described_class.new
100
118
  expect { obj.update!(id: 101, name: "Igor") }
101
119
  .to(raise_error)
102
120
  end
data/spec/entity_spec.rb CHANGED
@@ -3,7 +3,9 @@ require "spec_helper"
3
3
  describe Amorail::AmoEntity do
4
4
  before { mock_api }
5
5
 
6
- let(:entity) { Amorail::AmoEntity.new }
6
+ let(:entity) { described_class.new }
7
+
8
+ it_behaves_like 'entity_class'
7
9
 
8
10
  describe "#params" do
9
11
  let(:now) { Time.now }
@@ -11,13 +13,14 @@ describe Amorail::AmoEntity do
11
13
  subject { entity.params }
12
14
 
13
15
  specify { is_expected.to include(:last_modified) }
14
- specify { is_expected.not_to include(
15
- :id, :request_id, :responsible_user_id, :date_create)
16
+ specify {
17
+ is_expected.not_to include(
18
+ :id, :request_id, :responsible_user_id, :date_create)
16
19
  }
17
20
 
18
21
  context "with some values" do
19
22
  let(:entity) do
20
- Amorail::AmoEntity.new(
23
+ described_class.new(
21
24
  responsible_user_id: 2,
22
25
  last_modified: now
23
26
  )
@@ -25,14 +28,15 @@ describe Amorail::AmoEntity do
25
28
 
26
29
  specify { is_expected.to include(responsible_user_id: 2) }
27
30
  specify { is_expected.to include(last_modified: now.to_i) }
28
- specify { is_expected.not_to include(
29
- :id, :request_id, :date_create)
31
+ specify {
32
+ is_expected.not_to include(
33
+ :id, :request_id, :date_create)
30
34
  }
31
35
  end
32
36
 
33
37
  context "with all values" do
34
38
  let(:entity) do
35
- Amorail::AmoEntity.new(
39
+ described_class.new(
36
40
  id: 100,
37
41
  request_id: 1,
38
42
  responsible_user_id: 2,
@@ -1,64 +1,96 @@
1
- def mock_api
2
- authorize_stub(Amorail.config.api_endpoint,
3
- Amorail.config.usermail,
4
- Amorail.config.api_key)
1
+ module AmoWebMock
2
+ def mock_api
3
+ authorize_stub(
4
+ Amorail.config.api_endpoint,
5
+ Amorail.config.usermail,
6
+ Amorail.config.api_key)
5
7
 
6
- account_info_stub(Amorail.config.api_endpoint)
7
- end
8
+ account_info_stub(Amorail.config.api_endpoint)
9
+ end
8
10
 
9
- def authorize_stub(endpoint, usermail, api_key)
10
- stub_request(:post, "#{endpoint}/private/api/auth.php?type=json").
11
- with(:body => "{\"USER_LOGIN\":\"#{usermail}\",\"USER_HASH\":\"#{api_key}\"}",
12
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.1'}).
13
- to_return(:status => 200, :body => "", :headers => {'Set-Cookie' => 'PHPSESSID=58vorte6dd4t7h6mtuig9l0p50; path=/; domain=amocrm.ru'})
14
- end
11
+ def authorize_stub(endpoint, usermail, api_key)
12
+ cookie = 'PHPSESSID=58vorte6dd4t7h6mtuig9l0p50; path=/; domain=amocrm.ru'
13
+ stub_request(:post, "#{endpoint}/private/api/auth.php?type=json")
14
+ .with(
15
+ body: "{\"USER_LOGIN\":\"#{usermail}\",\"USER_HASH\":\"#{api_key}\"}"
16
+ )
17
+ .to_return(
18
+ status: 200,
19
+ body: "",
20
+ headers: {
21
+ 'Set-Cookie' => cookie
22
+ })
23
+ end
15
24
 
16
- def account_info_stub(endpoint)
17
- stub_request(:get, endpoint + '/private/api/v2/json/accounts/current').to_return(
18
- :body => File.read('./spec/fixtures/account_response.json'), headers: {'Content-Type'=>'application/json'}, status: 200
19
- )
20
- end
25
+ def account_info_stub(endpoint)
26
+ stub_request(:get, endpoint + '/private/api/v2/json/accounts/current')
27
+ .to_return(
28
+ body: File.read('./spec/fixtures/account_response.json'),
29
+ headers: { 'Content-Type' => 'application/json' },
30
+ status: 200
31
+ )
32
+ end
21
33
 
22
- def unauthorized_account_info_stub(endpoint)
23
- stub_request(:get, endpoint + '/private/api/v2/json/accounts/current').to_return(
24
- :body => "", status: 401
25
- )
26
- end
34
+ def unauthorized_account_info_stub(endpoint)
35
+ stub_request(:get, endpoint + '/private/api/v2/json/accounts/current')
36
+ .to_return(
37
+ body: "", status: 401
38
+ )
39
+ end
27
40
 
28
- def bad_req_account_info_stub(endpoint)
29
- stub_request(:post, endpoint + '/private/api/v2/json/accounts/current').with(:body => "{}",
30
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.1'}).to_return(
31
- :body => "", status: 400
32
- )
33
- end
41
+ def bad_req_account_info_stub(endpoint)
42
+ stub_request(:post, endpoint + '/private/api/v2/json/accounts/current')
43
+ .with(body: "{}")
44
+ .to_return(
45
+ body: "",
46
+ status: 400
47
+ )
48
+ end
34
49
 
35
- def contact_create_stub(endpoint)
36
- stub_request(:post, endpoint + '/private/api/v2/json/contacts/set').with(
37
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.1'}).to_return(
38
- :body => File.read('./spec/fixtures/contact_create.json'), headers: {'Content-Type'=>'application/json'}, status: 200
39
- )
40
- end
50
+ def contact_create_stub(endpoint)
51
+ stub_request(:post, endpoint + '/private/api/v2/json/contacts/set')
52
+ .to_return(
53
+ body: File.read('./spec/fixtures/contact_create.json'),
54
+ headers: { 'Content-Type' => 'application/json' },
55
+ status: 200
56
+ )
57
+ end
41
58
 
42
- def contact_update_stub(endpoint)
43
- stub_request(:post, endpoint + '/private/api/v2/json/contacts/set').with(
44
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.1'}).to_return(
45
- :body => File.read('./spec/fixtures/contact_update.json'), headers: {'Content-Type'=>'application/json'}, status: 200
46
- )
47
- end
59
+ def contact_update_stub(endpoint)
60
+ stub_request(:post, endpoint + '/private/api/v2/json/contacts/set')
61
+ .to_return(
62
+ body: File.read('./spec/fixtures/contact_update.json'),
63
+ headers: {
64
+ 'Content-Type' => 'application/json'
65
+ },
66
+ status: 200
67
+ )
68
+ end
48
69
 
49
- def contact_find_stub(endpoint, id, success = true)
50
- if success
51
- stub_request(:get, "#{endpoint}/private/api/v2/json/contacts/list?id=#{id}").to_return(
52
- :body => File.read('./spec/fixtures/contact_find.json'), headers: {'Content-Type'=>'application/json'}, status: 200
53
- )
54
- else
55
- stub_request(:get, "#{endpoint}/private/api/v2/json/contacts/list?id=#{id}").to_return(body: nil, status: 204)
70
+ def contact_find_stub(endpoint, id, success = true)
71
+ if success
72
+ stub_request(
73
+ :get,
74
+ "#{endpoint}/private/api/v2/json/contacts/list?id=#{id}")
75
+ .to_return(
76
+ body: File.read('./spec/fixtures/contact_find.json'),
77
+ headers: { 'Content-Type' => 'application/json' },
78
+ status: 200
79
+ )
80
+ else
81
+ stub_request(
82
+ :get,
83
+ "#{endpoint}/private/api/v2/json/contacts/list?id=#{id}")
84
+ .to_return(body: nil, status: 204)
85
+ end
56
86
  end
57
- end
58
87
 
59
- def company_create_stub(endpoint)
60
- stub_request(:post, endpoint + '/private/api/v2/json/company/set').with(
61
- :headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Faraday v0.9.1'}).to_return(
62
- :body => File.read('./spec/fixtures/contact_create.json'), headers: {'Content-Type'=>'application/json'}, status: 200
63
- )
88
+ def company_create_stub(endpoint)
89
+ stub_request(:post, endpoint + '/private/api/v2/json/company/set')
90
+ .to_return(
91
+ body: File.read('./spec/fixtures/contact_create.json'),
92
+ headers: { 'Content-Type' => 'application/json' },
93
+ status: 200
94
+ )
95
+ end
64
96
  end
data/spec/lead_spec.rb CHANGED
@@ -4,13 +4,28 @@ describe Amorail::AmoLead do
4
4
  before { mock_api }
5
5
 
6
6
  describe "validations" do
7
- it { should validate_presence_of(:name)}
8
- it { should validate_presence_of(:status_id)}
7
+ it { should validate_presence_of(:name) }
8
+ it { should validate_presence_of(:status_id) }
9
+ end
10
+
11
+ describe ".attributes" do
12
+ subject { described_class.attributes }
13
+
14
+ it_behaves_like 'entity_class'
15
+
16
+ specify do
17
+ is_expected.to include(
18
+ :name,
19
+ :price,
20
+ :status_id,
21
+ :tags
22
+ )
23
+ end
9
24
  end
10
25
 
11
26
  describe "#params" do
12
27
  let(:lead) do
13
- Amorail::AmoLead.new(
28
+ described_class.new(
14
29
  name: 'Test',
15
30
  price: 100,
16
31
  status_id: 2,
@@ -20,6 +35,7 @@ describe Amorail::AmoLead do
20
35
 
21
36
  subject { lead.params }
22
37
 
38
+ specify { is_expected.to include(:last_modified) }
23
39
  specify { is_expected.to include(name: 'Test') }
24
40
  specify { is_expected.to include(price: 100) }
25
41
  specify { is_expected.to include(status_id: 2) }
@@ -1,14 +1,14 @@
1
1
  require "spec_helper"
2
2
  require "webmock/rspec"
3
3
 
4
- describe "spec for Amorail Properties" do
4
+ describe Amorail::Property do
5
5
  before(:each) { mock_api }
6
6
 
7
- let(:prop) {Amorail.properties}
7
+ let(:prop) { Amorail.properties }
8
8
 
9
9
  it "should parse companies hash" do
10
10
  expect(prop.company.phone.present?).to be_truthy
11
- expect(prop.company.phone.is_a?(Amorail::Property::PropertyItem)).to be_truthy
11
+ expect(prop.company.phone.is_a?(described_class::PropertyItem)).to be_truthy
12
12
  expect(prop.company.phone.id.present?).to be_truthy
13
13
  expect(prop.company.data["phone"].data["id"]).to eq prop.company.phone.id
14
14
 
@@ -20,7 +20,7 @@ describe "spec for Amorail Properties" do
20
20
 
21
21
  it "should parse contacts hash" do
22
22
  expect(prop.contacts.email.present?).to be_truthy
23
- expect(prop.contacts.im.is_a?(Amorail::Property::PropertyItem)).to be_truthy
23
+ expect(prop.contacts.im.is_a?(described_class::PropertyItem)).to be_truthy
24
24
  expect(prop.contacts.im.id.present?).to be_truthy
25
25
  expect(prop.contacts.data["im"].data["id"]).to eq prop.contacts.im.id
26
26
 
@@ -39,4 +39,4 @@ describe "spec for Amorail Properties" do
39
39
  expect(prop.tasks.follow_up.id).to eq 1
40
40
  expect(prop.tasks["CALL"].id).to eq 1
41
41
  end
42
- end
42
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,10 +8,12 @@ require 'webmock/rspec'
8
8
  require 'shoulda/matchers'
9
9
  require 'helpers/webmock_helpers'
10
10
 
11
+ ENV.clear
11
12
  ENV["AMORAIL_CONF"] = File.expand_path("../fixtures/amorail_test.yml", __FILE__)
12
13
 
13
- Dir[File.expand_path("../support/**/*.rb",__FILE__)].each {|f| require f}
14
+ Dir[File.expand_path("../support/**/*.rb", __FILE__)].each { |f| require f }
14
15
 
15
16
  RSpec.configure do |config|
16
17
  config.mock_with :rspec
17
- end
18
+ include AmoWebMock
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples 'entity_class' do
4
+ subject { described_class.attributes }
5
+
6
+ specify do
7
+ is_expected.to include(
8
+ :id,
9
+ :request_id,
10
+ :responsible_user_id,
11
+ :date_create,
12
+ :last_modified
13
+ )
14
+ end
15
+ end