bookingsync-engine 3.0.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +101 -5
  3. data/app/controllers/sessions_controller.rb +1 -1
  4. data/lib/bookingsync-engine.rb +24 -1
  5. data/lib/bookingsync/engine.rb +26 -17
  6. data/lib/bookingsync/engine/application_credentials.rb +15 -0
  7. data/lib/bookingsync/engine/auth_helpers.rb +5 -2
  8. data/lib/bookingsync/engine/credentials_resolver.rb +18 -0
  9. data/lib/bookingsync/engine/models.rb +11 -0
  10. data/lib/bookingsync/engine/models/account.rb +36 -0
  11. data/lib/bookingsync/engine/models/application.rb +9 -0
  12. data/lib/bookingsync/engine/{model.rb → models/base_account.rb} +15 -27
  13. data/lib/bookingsync/engine/models/multi_applications_account.rb +47 -0
  14. data/lib/bookingsync/engine/version.rb +1 -1
  15. data/spec/controllers/authenticated_controller_spec.rb +1 -1
  16. data/spec/controllers/sessions_controller_spec.rb +28 -4
  17. data/spec/dummy/app/models/account.rb +1 -1
  18. data/spec/dummy/app/models/application.rb +3 -0
  19. data/spec/dummy/app/models/application_record.rb +3 -0
  20. data/spec/dummy/app/models/multi_applications_account.rb +3 -0
  21. data/spec/dummy/config/database.yml.docker +11 -0
  22. data/spec/dummy/config/initializers/bookingsync-engine.rb +3 -0
  23. data/spec/dummy/db/migrate/20140522110326_create_accounts.rb +1 -1
  24. data/spec/dummy/db/migrate/20140522110454_add_o_auth_fields_to_accounts.rb +1 -1
  25. data/spec/dummy/db/migrate/20181130062531_create_multi_applications_accounts.rb +8 -0
  26. data/spec/dummy/db/migrate/20181130062650_add_o_auth_fields_to_multi_applications_accounts.rb +14 -0
  27. data/spec/dummy/db/migrate/20181130063056_create_applications.rb +8 -0
  28. data/spec/dummy/db/migrate/20181130063104_add_credentials_fields_to_applications.rb +10 -0
  29. data/spec/dummy/db/schema.rb +41 -10
  30. data/spec/dummy/log/development.log +7423 -16
  31. data/spec/dummy/log/test.log +62430 -617
  32. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0A/0AkQ3CITU4KXnU7GsiDQLAWeLkJApWK8LSS1j7wEk2I.cache +0 -0
  33. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1M/1MTKfLxlwDryDP9C4ksVeuOF5FekTW5EddfnaJ4ujrA.cache +0 -0
  34. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2F/2FjAKNLL-jC6FeYfXsL0M8jItncHQcdDy239KNsTZQs.cache +1 -0
  35. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2_/2_hJriYgvh3UGtv5NMhrnkrtfpJlyTuQ4F5jYdVf8sQ.cache +1 -0
  36. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3J/3JfiofMyqvbHq3sZznFIDsFS81fHxyAWoCXJLrtrWP4.cache +0 -0
  37. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3f/3fwING3B2z9NOnWMwdXFatlVw06vge46KkOWOII0KlU.cache +1 -0
  38. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4i/4iLsjcOzC2_Y0hxnbPKuyayJABeUFDSyIh4Ed9OA8Xw.cache +0 -0
  39. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/50/502uMBbq2ELFXg5u1vtykxQ_whhsdgQnmTwNA96niD0.cache +0 -0
  40. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5s/5sm0UHvqondwU5MMfjMuqvLW2WQ6S7ylUf9PNw2uCTc.cache +1 -0
  41. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6F/6F2x1Bu3NKSTCTwUS6iCRFhKRT_ntZMzmPIMnVGabK4.cache +1 -0
  42. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6g/6gkpMq6BGSOyooWUFJJQCs2k3-tT0WID6Vg4wknhJoM.cache +0 -0
  43. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8K/8KNXqSB0siJpEjgLM64KpfTgX1FSbkYKxWso4jP9F6U.cache +0 -0
  44. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfiLjztc-8aILuCwNaYiWOika9XKeEiGNJJJK_LCEr4.cache +0 -0
  45. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CM/CMaRV8szi0IicAXD33YjDgWpLw468X08ycoS-ndwO5o.cache +0 -0
  46. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cc/CcghYxY4f6VUjmyR9LJJi0rYn2LXCdBR9t8Qn4SroL8.cache +0 -0
  47. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/CjEM6wfYwxY_zG--WNzelIKjC420AU9WpvQLgolQOPM.cache +1 -0
  48. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/cJJ0QWQg4eJ37I13drpPfSy27rwN7iqiQYPswqRm_Po.cache +0 -0
  49. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/E2/E2tGPoiGjrMuq9vL-ndjkozskpSFwLcGQXxJf_dl4z0.cache +0 -0
  50. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/ENHTZiiuQ1cqn16401VaQQBp7b0gwZOA7_I-W5CL5ig.cache +1 -0
  51. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EV/EVkLQJ6idLBSbQnkUelhejMxSOql0wh2QbtfKpdJiak.cache +1 -0
  52. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gg/Gg6i-z0G_WiBfMUE_gmveurGXQff5_TlQi29HwQcZ-8.cache +1 -0
  53. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Go/Gohhb2B4rJ5hYmGM-VhZxS5dB_NFtsEAdbP1kTKDUeU.cache +0 -0
  54. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IH/IHM0sjf5lujHT6BG1cYKLB0rdqCd1KYYR5SLZkxXi1k.cache +1 -0
  55. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NS/NSFU7p8JOb9tHDvG74s3jdRt4ONYZoCTluL3HEsrPxc.cache +0 -0
  56. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OX/OXQFRQZ5OA2i3YtnP1fZ96aWeUC3_IIqO4fAMdR9FsM.cache +2 -0
  57. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oi/OiV2J0lyHQgXCDgtmFPNLE59EbztPsv9MNy05s943Yw.cache +2 -0
  58. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ps/PsVVU35DPe0tSyJ1zEoiPaaJiwo6NclhO2OKuFSn76A.cache +0 -0
  59. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R-/R-onhPbfjYnU6tM9fR0wZkXDSvCLrY5G1wyNCSVmKEs.cache +1 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RRXzNBrpSlU0RGhaxTSE_1GoRrV4JkWqF0ZoOf9xtzQ.cache +0 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rd/Rd_ZtA5c34XyxDbTpkN8_ZfF1x78s46DbRXLu0jqMgo.cache +1 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Sm/SmJRxdUchUsyyMi6zvsdwrcRR1hfQ9YeSZNKNM-n5lw.cache +0 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Su/Sue46_TUXTlImzpNh2bkqDFL5cQ08rCAcaaJqlWI7qg.cache +0 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T1/T1lVNy8C6VpxjRsI38DgOfG7yIh3OohPWTNZmJb8CPo.cache +0 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Z-/Z-P7NJ7vzHin8mjLSAoWJW6FZfd6xwWS3xuoCX0DE40.cache +0 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Z9/Z9d8_EzLy9N7tx_nHmbmBF5LzFtW_0sik4AH1IFBX0Y.cache +1 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ze/ZelUAL6jLQcQiGZUfnAbvuJbU9OAqHiXV_Ccu8lToho.cache +1 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zr/Zr7RfTTM_QNQ-7MuSD-M0rF18yH25tCSI9G4H5yYjAQ.cache +1 -0
  69. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_S/_SxbUQwhqQU8951QbOA6ZZ41F0d9D-VhhQqUE4BCryQ.cache +0 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_o/_okSFa_t7W5YJBZTW7ZitTwnmAFYgJup7tpTYum0Udo.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aJ/aJ4EkukIrCHlOkA1WpQIasGGosjGkOKvRMsfcNQx1QQ.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bk/bk_rOYlFWoHkh4HHsvbxeo8rSvDWRX6cCbVlO2VCVNA.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cO/cOGLhXoKF0BumBbtviyCY1xusm_WMEMhGSWY9qFekRU.cache +2 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cq/cqMX8l9XlG5jEWd0fWjA7MTlj21d6dzcnhhOq08uFHY.cache +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cy/cyurAtFfq8D4ORO-aDATDzTKcBumJfgafhOUCbECuMw.cache +0 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eO/eOY3YH36a6yvdznpQqACMiI0e1CcTwPiEjUdhRfmm9k.cache +0 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/f3/f3VckKo5w8mrxeqmzwLfZr7f6sj0dA8xZrFq3GMF0ig.cache +1 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fS/fSn1A2ssuKdsdJ-uwH_i8bXBaWmbJd0wHd-Ob6pTPi0.cache +1 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gD/gDQJ-WkVLldqzYHKOLkamKeU-sTkDscHqOQawz7a6m4.cache +0 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache +0 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jH/jHvwYeln0CEBatCDHIjJMF0vIdmuDmS_eTKNxFhOmlA.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jU/jUktWNbR4V7n34UAZe7uJpmEofhflF0bVtIO2BgxyJ8.cache +2 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jb/jb46fu3q3DLQ7TFyiuaXmL_CPF7cQst2RgrF0xVyGtA.cache +1 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/le/lekrQ_bDFewtYzH2xoA2tovuPzYdoSwnauQ4MgDwb0U.cache +1 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m8/m8I0GZ1puWB4hISNebXEGDX3G5QkoSVWHP4SiRvN-3Y.cache +0 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNEeM32MBaqiZ0_N_eheQR9oimoBpmcXRXr5puTAh3o.cache +0 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNaj9zqaawn26kC4FL9ECzN5lkppnwTTQ93MIeJRKZg.cache +1 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mnJy7Ei2tJLs8tfmmUHjtWmfk2yfl1opoYG7Deg2bWQ.cache +0 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache +0 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oS/oS5JF4El36MylOD0SJtv4YV-fsqNzd89t1IqlBzwYes.cache +1 -0
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oY/oYCeXuzhz0IQEBtepScpQ7HlUp5yVleUE6BOLsnhXwA.cache +1 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oZ/oZDDUJWB1xgHo4uv_iiUCtutWZ6LeJykII3cNkmd_bA.cache +1 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u-/u-Iidm4zcU2RFkiqJFQkLTBxXuEoF5gCeJM4V5-3Qyc.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uK/uKpQUG2ys9fKuyfsrw1Payh72LhuIrYJXep13nTbIIc.cache +1 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uX/uXHfYanP3WS7whlKHqs0pLBkEQwj_IGbfmktFdHfZ_A.cache +0 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v9/v9HWdIdg3uuXOOqxWg8Y6aWxzqbywfxecFSDm5ilUs8.cache +1 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w2/w2izaLMTzGRpPOq1R_Yl-0Ma7hm7tej5kSjV9khvFSk.cache +1 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y4/y4-jRuYEQUuCPpXrCIiCC1lgXmW4pm12ZEla-d56noA.cache +1 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yW/yWlGtA8E8Li2epEGqbxtvBeb5h0e52XZQ8xKiMXgDOY.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yZ/yZRcLaNBQxCgGewY_IaXZrXG1YmOhr1iSxfZ-4MMK9Y.cache +0 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zU/zUYxN3uLSvSCpp561lMJSJXPGanKNgxT32rw-w5jpPs.cache +0 -0
  104. data/spec/dummy/tmp/restart.txt +0 -0
  105. data/spec/helpers/auth_helpers_spec.rb +42 -0
  106. data/spec/lib/bookingsync/engine/application_credentials_spec.rb +41 -0
  107. data/spec/lib/bookingsync/engine/credentials_resolver_spec.rb +18 -0
  108. data/spec/models/account_spec.rb +130 -41
  109. data/spec/models/application_spec.rb +16 -0
  110. data/spec/models/multi_application_account_spec.rb +247 -0
  111. data/spec/spec_helper.rb +6 -4
  112. metadata +256 -34
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Application, type: :model do
4
+ let!(:application) do
5
+ Application.create(host: "test.host", client_id: "abc", client_secret: "def")
6
+ end
7
+
8
+ describe "validations" do
9
+ it { is_expected.to validate_uniqueness_of(:host) }
10
+ it { is_expected.to validate_presence_of(:host) }
11
+ it { is_expected.to validate_uniqueness_of(:client_id) }
12
+ it { is_expected.to validate_presence_of(:client_id) }
13
+ it { is_expected.to validate_uniqueness_of(:client_secret) }
14
+ it { is_expected.to validate_presence_of(:client_secret) }
15
+ end
16
+ end
@@ -0,0 +1,247 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe MultiApplicationsAccount, type: :model do
4
+ shared_examples "it takes attributes from auth" do
5
+ it "sets name" do
6
+ expect(account.name).to eq "business name"
7
+ end
8
+
9
+ it "sets token" do
10
+ expect(account.oauth_access_token).to eql("token")
11
+ expect(account.oauth_refresh_token).to eql("refresh token")
12
+ expect(account.oauth_expires_at).to eql("expires at")
13
+ end
14
+ end
15
+
16
+ describe "validations" do
17
+ let!(:account) do
18
+ MultiApplicationsAccount.create!(provider: "bookingsync", synced_id: 123, host: "example.test")
19
+ end
20
+
21
+ it { is_expected.to validate_uniqueness_of(:synced_id).scoped_to(:host).case_insensitive }
22
+ end
23
+
24
+ describe ".from_omniauth" do
25
+ let(:auth) { OmniAuth.config.mock_auth[:bookingsync] }
26
+ let!(:account) do
27
+ MultiApplicationsAccount.create!(provider: "bookingsync", synced_id: 123, host: "example.test")
28
+ end
29
+ let!(:account2) do
30
+ MultiApplicationsAccount.create!(provider: "bookingsync", synced_id: 456, host: "example2.test")
31
+ end
32
+
33
+ context "without host given" do
34
+ it "raises an error" do
35
+ expect { MultiApplicationsAccount.from_omniauth(auth, nil) }.to raise_error(ArgumentError,
36
+ "The `host` variable must be passed when using BookingSync Engine with multi application support")
37
+ end
38
+ end
39
+
40
+ context "with host given" do
41
+ context "when account exists" do
42
+ it "loads the existing account" do
43
+ expect(MultiApplicationsAccount.from_omniauth(auth, "example.test")).to eql(account)
44
+ end
45
+
46
+ describe "the updated account" do
47
+ before do
48
+ MultiApplicationsAccount.from_omniauth(auth, "example.test")
49
+ account.reload
50
+ end
51
+
52
+ it_behaves_like "it takes attributes from auth"
53
+ end
54
+ end
55
+
56
+ context "when account doesn't exist" do
57
+ it "creates new account" do
58
+ expect {
59
+ MultiApplicationsAccount.from_omniauth(auth, "example3.test")
60
+ }.to change { MultiApplicationsAccount.count }.by(1)
61
+ end
62
+
63
+ describe "the newly created account" do
64
+ let!(:account) { MultiApplicationsAccount.from_omniauth(auth, "example3.test") }
65
+
66
+ it "sets synced_id and provider from auth as well as host" do
67
+ expect(account.synced_id).to eq 123
68
+ expect(account.provider).to eq "bookingsync"
69
+ expect(account.host).to eq "example3.test"
70
+ end
71
+
72
+ it_behaves_like "it takes attributes from auth"
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ describe ".find_by_host_and_synced_id" do
79
+ let!(:account_1) { MultiApplicationsAccount.create!(synced_id: 1, host: "example.test") }
80
+ let!(:account_2) { MultiApplicationsAccount.create!(synced_id: 2, host: "example.test") }
81
+ let!(:account_3) { MultiApplicationsAccount.create!(synced_id: 1, host: "example2.test") }
82
+ let!(:account_4) { MultiApplicationsAccount.create!(synced_id: 2, host: "example2.test") }
83
+
84
+ it "returns the right account" do
85
+ expect(MultiApplicationsAccount.find_by_host_and_synced_id("example2.test", 1)).to eq account_3
86
+ end
87
+ end
88
+
89
+ describe "#token" do
90
+
91
+ let!(:account) do
92
+ MultiApplicationsAccount.create!(
93
+ synced_id: 123, host: "example.test",
94
+ oauth_access_token: "token", oauth_refresh_token: "refresh_token",
95
+ oauth_expires_at: expires_at
96
+ )
97
+ end
98
+ let!(:application) { Application.create!(host: "example.test", client_id: "123", client_secret: "456") }
99
+
100
+ context "when the stored token is fresh" do
101
+ let(:expires_at) { 1.day.from_now.to_i }
102
+
103
+ it "returns the token" do
104
+ expect(account.token).to be_a OAuth2::AccessToken
105
+ expect(account.token.token).to eq "token"
106
+ end
107
+ end
108
+
109
+ context "when the stored token is expired" do
110
+ around do |test_case|
111
+ # comparing rails version, the use_transactional_fixtures only works pre 5
112
+ if Rails::VERSION::MAJOR >= 5
113
+ original_setup = self.use_transactional_tests
114
+ self.use_transactional_tests = false
115
+ test_case.run
116
+ self.use_transactional_tests = original_setup
117
+ else
118
+ original_setup = self.use_transactional_fixtures
119
+ self.use_transactional_fixtures = false
120
+ test_case.run
121
+ self.use_transactional_fixtures = original_setup
122
+ end
123
+ end
124
+
125
+ let(:expires_at) { 1.day.ago.to_i.to_s }
126
+
127
+ before do
128
+ stub_request(:post, "https://some_url.com/oauth/token").with(
129
+ body: {
130
+ "client_id" => "123",
131
+ "client_secret" => "456",
132
+ "grant_type" => "refresh_token",
133
+ "refresh_token" => "refresh_token"
134
+ },
135
+ headers: {
136
+ "Accept" => "application/vnd.api+json",
137
+ "Content-Type" => "application/x-www-form-urlencoded"
138
+ }
139
+ ).to_return(
140
+ status: 200,
141
+ body: { "access_token": "refreshed_token" }.to_json,
142
+ headers: { "Content-Type" => "application/json" }
143
+ )
144
+ end
145
+
146
+ it "refreshes the token" do
147
+ expect(account.token).to be_a OAuth2::AccessToken
148
+ expect(account.token.token).to eq "refreshed_token"
149
+ end
150
+ end
151
+ end
152
+
153
+ describe "#application_token" do
154
+ let!(:account) { MultiApplicationsAccount.create!(synced_id: 123, host: "test.example") }
155
+ let!(:application) { Application.create!(host: "test.example", client_id: "123", client_secret: "456") }
156
+
157
+ before do
158
+ stub_request(:post, "https://some_url.com/oauth/token").with(
159
+ body: {
160
+ "client_id" => "123",
161
+ "client_secret" => "456",
162
+ "grant_type"=>"client_credentials"
163
+ },
164
+ headers: {
165
+ "Accept" => "application/vnd.api+json",
166
+ "Content-Type" => "application/x-www-form-urlencoded"
167
+ }
168
+ ).to_return(
169
+ status: 200,
170
+ body: { "access_token": "the_access_token" }.to_json,
171
+ headers: { "Content-Type" => "application/json" }
172
+ )
173
+ end
174
+
175
+ it "returns a client credential token setup with application's credentials" do
176
+ expect(account.application_token.token).to eq "the_access_token"
177
+ end
178
+ end
179
+
180
+ describe "#oauth_client" do
181
+ let!(:account) { MultiApplicationsAccount.create!(synced_id: 123, host: "test.example") }
182
+ let!(:application) { Application.create!(host: "test.example", client_id: "123", client_secret: "456") }
183
+
184
+ it "returns a BookingSync::Engine.oauth_client setup with application's credentials" do
185
+ expect(account.oauth_client).to be_an OAuth2::Client
186
+ expect(account.oauth_client.id).to eq application.client_id
187
+ expect(account.oauth_client.secret).to eq application.client_secret
188
+ end
189
+ end
190
+
191
+ describe "#application" do
192
+ let!(:account) { MultiApplicationsAccount.create!(synced_id: 123, host: "test.example") }
193
+ let!(:application) { Application.create!(host: "test.example", client_id: "123", client_secret: "456") }
194
+ let!(:application2) { Application.create!(host: "test2.example", client_id: "234", client_secret: "567") }
195
+
196
+ it "returns the application matching the host" do
197
+ expect(account.application).to eq application
198
+ end
199
+ end
200
+
201
+ describe "#api" do
202
+ let!(:application) do
203
+ Application.create!(client_id: "client_id", client_secret: "client_secret", host: "host")
204
+ end
205
+ let!(:account) do
206
+ MultiApplicationsAccount.new(oauth_access_token: "access_token", host: "host")
207
+ end
208
+
209
+ it "returns API client initialized with OAuth token" do
210
+ expect(account.api).to be_kind_of(BookingSync::API::Client)
211
+ expect(account.api.token).to eq("access_token")
212
+ end
213
+ end
214
+
215
+ describe "#clear_token!" do
216
+ let!(:account) do
217
+ MultiApplicationsAccount.create!(oauth_access_token: "token",
218
+ oauth_refresh_token: "refresh", oauth_expires_at: "expires", host: "example.test")
219
+ end
220
+
221
+ it "clears token related fields on account" do
222
+ expect { account.clear_token! }
223
+ .to change { account.reload.oauth_access_token }.from("token").to(nil)
224
+ .and change { account.oauth_refresh_token }.from("refresh").to(nil)
225
+ .and change { account.oauth_expires_at }.from("expires").to(nil)
226
+ end
227
+ end
228
+
229
+ describe "#update_token" do
230
+ let!(:account) do
231
+ MultiApplicationsAccount.create!(oauth_access_token: "token",
232
+ oauth_refresh_token: "refresh", oauth_expires_at: "expires", host: "example.test")
233
+ end
234
+
235
+ let(:token) do
236
+ double(token: "new_access_token", refresh_token: "new_refresh_token",
237
+ expires_at: "new_expires_at")
238
+ end
239
+
240
+ it "updates the token related fields on account" do
241
+ expect { account.update_token(token) }
242
+ .to change { account.oauth_access_token }.from("token").to("new_access_token")
243
+ .and change { account.oauth_refresh_token }.from("refresh").to("new_refresh_token")
244
+ .and change { account.oauth_expires_at }.from("expires").to("new_expires_at")
245
+ end
246
+ end
247
+ end
@@ -1,9 +1,11 @@
1
- ENV['RAILS_ENV'] ||= 'test'
1
+ ENV["RAILS_ENV"] ||= "test"
2
2
 
3
3
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
- require 'rspec/rails'
5
- require 'shoulda/matchers'
6
- require 'pry-rails'
4
+ require "dotenv/load"
5
+ require "rspec/rails"
6
+ require "shoulda/matchers"
7
+ require "pry-rails"
8
+ require "webmock/rspec"
7
9
 
8
10
  # Load support files
9
11
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookingsync-engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastien Grosjean
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-11-30 00:00:00.000000000 Z
12
+ date: 2019-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -29,14 +29,14 @@ dependencies:
29
29
  name: omniauth-bookingsync
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: 0.5.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: 0.5.0
42
42
  - !ruby/object:Gem::Dependency
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: dotenv-rails
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: pg
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -137,6 +151,34 @@ dependencies:
137
151
  - - "~>"
138
152
  - !ruby/object:Gem::Version
139
153
  version: '3.0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: bookingsync-stylecheck
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: webmock
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
140
182
  description: A Rails engine to simplify integration with BookingSync API
141
183
  email:
142
184
  - dev@bookingsync.com
@@ -154,9 +196,15 @@ files:
154
196
  - lib/bookingsync.rb
155
197
  - lib/bookingsync/engine.rb
156
198
  - lib/bookingsync/engine/api_client.rb
199
+ - lib/bookingsync/engine/application_credentials.rb
157
200
  - lib/bookingsync/engine/auth_helpers.rb
201
+ - lib/bookingsync/engine/credentials_resolver.rb
158
202
  - lib/bookingsync/engine/helpers.rb
159
- - lib/bookingsync/engine/model.rb
203
+ - lib/bookingsync/engine/models.rb
204
+ - lib/bookingsync/engine/models/account.rb
205
+ - lib/bookingsync/engine/models/application.rb
206
+ - lib/bookingsync/engine/models/base_account.rb
207
+ - lib/bookingsync/engine/models/multi_applications_account.rb
160
208
  - lib/bookingsync/engine/session_helpers.rb
161
209
  - lib/bookingsync/engine/version.rb
162
210
  - lib/generators/bookingsync/install/install_generator.rb
@@ -172,6 +220,9 @@ files:
172
220
  - spec/dummy/app/controllers/home_controller.rb
173
221
  - spec/dummy/app/helpers/application_helper.rb
174
222
  - spec/dummy/app/models/account.rb
223
+ - spec/dummy/app/models/application.rb
224
+ - spec/dummy/app/models/application_record.rb
225
+ - spec/dummy/app/models/multi_applications_account.rb
175
226
  - spec/dummy/app/views/layouts/application.html.erb
176
227
  - spec/dummy/bin/bundle
177
228
  - spec/dummy/bin/rails
@@ -180,12 +231,14 @@ files:
180
231
  - spec/dummy/config/application.rb
181
232
  - spec/dummy/config/boot.rb
182
233
  - spec/dummy/config/database.yml
234
+ - spec/dummy/config/database.yml.docker
183
235
  - spec/dummy/config/database.yml.travis
184
236
  - spec/dummy/config/environment.rb
185
237
  - spec/dummy/config/environments/development.rb
186
238
  - spec/dummy/config/environments/production.rb
187
239
  - spec/dummy/config/environments/test.rb
188
240
  - spec/dummy/config/initializers/backtrace_silencers.rb
241
+ - spec/dummy/config/initializers/bookingsync-engine.rb
189
242
  - spec/dummy/config/initializers/filter_parameter_logging.rb
190
243
  - spec/dummy/config/initializers/inflections.rb
191
244
  - spec/dummy/config/initializers/mime_types.rb
@@ -196,6 +249,10 @@ files:
196
249
  - spec/dummy/config/routes.rb
197
250
  - spec/dummy/db/migrate/20140522110326_create_accounts.rb
198
251
  - spec/dummy/db/migrate/20140522110454_add_o_auth_fields_to_accounts.rb
252
+ - spec/dummy/db/migrate/20181130062531_create_multi_applications_accounts.rb
253
+ - spec/dummy/db/migrate/20181130062650_add_o_auth_fields_to_multi_applications_accounts.rb
254
+ - spec/dummy/db/migrate/20181130063056_create_applications.rb
255
+ - spec/dummy/db/migrate/20181130063104_add_credentials_fields_to_applications.rb
199
256
  - spec/dummy/db/schema.rb
200
257
  - spec/dummy/log/development.log
201
258
  - spec/dummy/log/test.log
@@ -203,8 +260,86 @@ files:
203
260
  - spec/dummy/public/422.html
204
261
  - spec/dummy/public/500.html
205
262
  - spec/dummy/public/favicon.ico
263
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/0A/0AkQ3CITU4KXnU7GsiDQLAWeLkJApWK8LSS1j7wEk2I.cache
264
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/1M/1MTKfLxlwDryDP9C4ksVeuOF5FekTW5EddfnaJ4ujrA.cache
265
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2F/2FjAKNLL-jC6FeYfXsL0M8jItncHQcdDy239KNsTZQs.cache
266
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2_/2_hJriYgvh3UGtv5NMhrnkrtfpJlyTuQ4F5jYdVf8sQ.cache
267
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3J/3JfiofMyqvbHq3sZznFIDsFS81fHxyAWoCXJLrtrWP4.cache
268
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3f/3fwING3B2z9NOnWMwdXFatlVw06vge46KkOWOII0KlU.cache
269
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/4i/4iLsjcOzC2_Y0hxnbPKuyayJABeUFDSyIh4Ed9OA8Xw.cache
270
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/50/502uMBbq2ELFXg5u1vtykxQ_whhsdgQnmTwNA96niD0.cache
271
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/5s/5sm0UHvqondwU5MMfjMuqvLW2WQ6S7ylUf9PNw2uCTc.cache
272
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/6F/6F2x1Bu3NKSTCTwUS6iCRFhKRT_ntZMzmPIMnVGabK4.cache
273
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/6g/6gkpMq6BGSOyooWUFJJQCs2k3-tT0WID6Vg4wknhJoM.cache
274
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/8K/8KNXqSB0siJpEjgLM64KpfTgX1FSbkYKxWso4jP9F6U.cache
275
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfiLjztc-8aILuCwNaYiWOika9XKeEiGNJJJK_LCEr4.cache
276
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/CM/CMaRV8szi0IicAXD33YjDgWpLw468X08ycoS-ndwO5o.cache
277
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cc/CcghYxY4f6VUjmyR9LJJi0rYn2LXCdBR9t8Qn4SroL8.cache
278
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/CjEM6wfYwxY_zG--WNzelIKjC420AU9WpvQLgolQOPM.cache
279
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/cJJ0QWQg4eJ37I13drpPfSy27rwN7iqiQYPswqRm_Po.cache
280
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/E2/E2tGPoiGjrMuq9vL-ndjkozskpSFwLcGQXxJf_dl4z0.cache
281
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/ENHTZiiuQ1cqn16401VaQQBp7b0gwZOA7_I-W5CL5ig.cache
282
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/EV/EVkLQJ6idLBSbQnkUelhejMxSOql0wh2QbtfKpdJiak.cache
283
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Gg/Gg6i-z0G_WiBfMUE_gmveurGXQff5_TlQi29HwQcZ-8.cache
284
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Go/Gohhb2B4rJ5hYmGM-VhZxS5dB_NFtsEAdbP1kTKDUeU.cache
285
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/IH/IHM0sjf5lujHT6BG1cYKLB0rdqCd1KYYR5SLZkxXi1k.cache
286
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/NS/NSFU7p8JOb9tHDvG74s3jdRt4ONYZoCTluL3HEsrPxc.cache
287
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/OX/OXQFRQZ5OA2i3YtnP1fZ96aWeUC3_IIqO4fAMdR9FsM.cache
288
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Oi/OiV2J0lyHQgXCDgtmFPNLE59EbztPsv9MNy05s943Yw.cache
289
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ps/PsVVU35DPe0tSyJ1zEoiPaaJiwo6NclhO2OKuFSn76A.cache
290
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/R-/R-onhPbfjYnU6tM9fR0wZkXDSvCLrY5G1wyNCSVmKEs.cache
291
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RRXzNBrpSlU0RGhaxTSE_1GoRrV4JkWqF0ZoOf9xtzQ.cache
292
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rd/Rd_ZtA5c34XyxDbTpkN8_ZfF1x78s46DbRXLu0jqMgo.cache
293
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Sm/SmJRxdUchUsyyMi6zvsdwrcRR1hfQ9YeSZNKNM-n5lw.cache
294
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Su/Sue46_TUXTlImzpNh2bkqDFL5cQ08rCAcaaJqlWI7qg.cache
295
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/T1/T1lVNy8C6VpxjRsI38DgOfG7yIh3OohPWTNZmJb8CPo.cache
296
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z-/Z-P7NJ7vzHin8mjLSAoWJW6FZfd6xwWS3xuoCX0DE40.cache
297
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z9/Z9d8_EzLy9N7tx_nHmbmBF5LzFtW_0sik4AH1IFBX0Y.cache
298
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ze/ZelUAL6jLQcQiGZUfnAbvuJbU9OAqHiXV_Ccu8lToho.cache
299
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Zr/Zr7RfTTM_QNQ-7MuSD-M0rF18yH25tCSI9G4H5yYjAQ.cache
300
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_S/_SxbUQwhqQU8951QbOA6ZZ41F0d9D-VhhQqUE4BCryQ.cache
301
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_o/_okSFa_t7W5YJBZTW7ZitTwnmAFYgJup7tpTYum0Udo.cache
302
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/aJ/aJ4EkukIrCHlOkA1WpQIasGGosjGkOKvRMsfcNQx1QQ.cache
303
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/bk/bk_rOYlFWoHkh4HHsvbxeo8rSvDWRX6cCbVlO2VCVNA.cache
304
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cO/cOGLhXoKF0BumBbtviyCY1xusm_WMEMhGSWY9qFekRU.cache
305
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cq/cqMX8l9XlG5jEWd0fWjA7MTlj21d6dzcnhhOq08uFHY.cache
306
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cy/cyurAtFfq8D4ORO-aDATDzTKcBumJfgafhOUCbECuMw.cache
307
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/eO/eOY3YH36a6yvdznpQqACMiI0e1CcTwPiEjUdhRfmm9k.cache
308
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/f3/f3VckKo5w8mrxeqmzwLfZr7f6sj0dA8xZrFq3GMF0ig.cache
309
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/fS/fSn1A2ssuKdsdJ-uwH_i8bXBaWmbJd0wHd-Ob6pTPi0.cache
310
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/gD/gDQJ-WkVLldqzYHKOLkamKeU-sTkDscHqOQawz7a6m4.cache
311
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache
312
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jH/jHvwYeln0CEBatCDHIjJMF0vIdmuDmS_eTKNxFhOmlA.cache
313
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jU/jUktWNbR4V7n34UAZe7uJpmEofhflF0bVtIO2BgxyJ8.cache
314
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jb/jb46fu3q3DLQ7TFyiuaXmL_CPF7cQst2RgrF0xVyGtA.cache
315
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/le/lekrQ_bDFewtYzH2xoA2tovuPzYdoSwnauQ4MgDwb0U.cache
316
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/m8/m8I0GZ1puWB4hISNebXEGDX3G5QkoSVWHP4SiRvN-3Y.cache
317
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNEeM32MBaqiZ0_N_eheQR9oimoBpmcXRXr5puTAh3o.cache
318
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNaj9zqaawn26kC4FL9ECzN5lkppnwTTQ93MIeJRKZg.cache
319
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mnJy7Ei2tJLs8tfmmUHjtWmfk2yfl1opoYG7Deg2bWQ.cache
320
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache
321
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oS/oS5JF4El36MylOD0SJtv4YV-fsqNzd89t1IqlBzwYes.cache
322
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oY/oYCeXuzhz0IQEBtepScpQ7HlUp5yVleUE6BOLsnhXwA.cache
323
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oZ/oZDDUJWB1xgHo4uv_iiUCtutWZ6LeJykII3cNkmd_bA.cache
324
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache
325
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/u-/u-Iidm4zcU2RFkiqJFQkLTBxXuEoF5gCeJM4V5-3Qyc.cache
326
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/uK/uKpQUG2ys9fKuyfsrw1Payh72LhuIrYJXep13nTbIIc.cache
327
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/uX/uXHfYanP3WS7whlKHqs0pLBkEQwj_IGbfmktFdHfZ_A.cache
328
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/v9/v9HWdIdg3uuXOOqxWg8Y6aWxzqbywfxecFSDm5ilUs8.cache
329
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/w2/w2izaLMTzGRpPOq1R_Yl-0Ma7hm7tej5kSjV9khvFSk.cache
330
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache
331
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/y4/y4-jRuYEQUuCPpXrCIiCC1lgXmW4pm12ZEla-d56noA.cache
332
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yW/yWlGtA8E8Li2epEGqbxtvBeb5h0e52XZQ8xKiMXgDOY.cache
333
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yZ/yZRcLaNBQxCgGewY_IaXZrXG1YmOhr1iSxfZ-4MMK9Y.cache
334
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/zU/zUYxN3uLSvSCpp561lMJSJXPGanKNgxT32rw-w5jpPs.cache
335
+ - spec/dummy/tmp/restart.txt
206
336
  - spec/fixtures/accounts.yml
337
+ - spec/helpers/auth_helpers_spec.rb
338
+ - spec/lib/bookingsync/engine/application_credentials_spec.rb
339
+ - spec/lib/bookingsync/engine/credentials_resolver_spec.rb
207
340
  - spec/models/account_spec.rb
341
+ - spec/models/application_spec.rb
342
+ - spec/models/multi_application_account_spec.rb
208
343
  - spec/routing/oauth_routing_spec.rb
209
344
  - spec/spec_helper.rb
210
345
  - spec/support/omniauth.rb
@@ -228,55 +363,142 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
363
  version: '0'
229
364
  requirements: []
230
365
  rubyforge_project:
231
- rubygems_version: 2.5.1
366
+ rubygems_version: 2.6.14
232
367
  signing_key:
233
368
  specification_version: 4
234
369
  summary: A Rails engine to simplify integration with BookingSync API
235
370
  test_files:
236
- - spec/controllers/authenticated_controller_spec.rb
237
- - spec/controllers/sessions_controller_spec.rb
238
- - spec/dummy/app/assets/javascripts/application.js
239
- - spec/dummy/app/assets/stylesheets/application.css
371
+ - spec/spec_helper.rb
372
+ - spec/dummy/app/models/account.rb
373
+ - spec/dummy/app/models/application.rb
374
+ - spec/dummy/app/models/multi_applications_account.rb
375
+ - spec/dummy/app/models/application_record.rb
240
376
  - spec/dummy/app/controllers/application_controller.rb
241
377
  - spec/dummy/app/controllers/authenticated_controller.rb
242
378
  - spec/dummy/app/controllers/home_controller.rb
243
- - spec/dummy/app/helpers/application_helper.rb
244
- - spec/dummy/app/models/account.rb
245
379
  - spec/dummy/app/views/layouts/application.html.erb
380
+ - spec/dummy/app/assets/javascripts/application.js
381
+ - spec/dummy/app/assets/stylesheets/application.css
382
+ - spec/dummy/app/helpers/application_helper.rb
383
+ - spec/dummy/bin/rake
246
384
  - spec/dummy/bin/bundle
247
385
  - spec/dummy/bin/rails
248
- - spec/dummy/bin/rake
249
- - spec/dummy/config/application.rb
250
- - spec/dummy/config/boot.rb
251
- - spec/dummy/config/database.yml
386
+ - spec/dummy/config/routes.rb
387
+ - spec/dummy/config/locales/en.yml
252
388
  - spec/dummy/config/database.yml.travis
253
- - spec/dummy/config/environment.rb
254
- - spec/dummy/config/environments/development.rb
255
389
  - spec/dummy/config/environments/production.rb
390
+ - spec/dummy/config/environments/development.rb
256
391
  - spec/dummy/config/environments/test.rb
392
+ - spec/dummy/config/environment.rb
393
+ - spec/dummy/config/application.rb
394
+ - spec/dummy/config/database.yml
395
+ - spec/dummy/config/boot.rb
396
+ - spec/dummy/config/database.yml.docker
257
397
  - spec/dummy/config/initializers/backtrace_silencers.rb
258
- - spec/dummy/config/initializers/filter_parameter_logging.rb
259
- - spec/dummy/config/initializers/inflections.rb
398
+ - spec/dummy/config/initializers/bookingsync-engine.rb
260
399
  - spec/dummy/config/initializers/mime_types.rb
261
- - spec/dummy/config/initializers/secret_token.rb
400
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
262
401
  - spec/dummy/config/initializers/session_store.rb
263
402
  - spec/dummy/config/initializers/wrap_parameters.rb
264
- - spec/dummy/config/locales/en.yml
265
- - spec/dummy/config/routes.rb
403
+ - spec/dummy/config/initializers/secret_token.rb
404
+ - spec/dummy/config/initializers/inflections.rb
266
405
  - spec/dummy/config.ru
267
- - spec/dummy/db/migrate/20140522110326_create_accounts.rb
268
- - spec/dummy/db/migrate/20140522110454_add_o_auth_fields_to_accounts.rb
269
- - spec/dummy/db/schema.rb
270
- - spec/dummy/log/development.log
271
- - spec/dummy/log/test.log
272
- - spec/dummy/public/404.html
406
+ - spec/dummy/Rakefile
407
+ - spec/dummy/public/favicon.ico
273
408
  - spec/dummy/public/422.html
274
409
  - spec/dummy/public/500.html
275
- - spec/dummy/public/favicon.ico
276
- - spec/dummy/Rakefile
410
+ - spec/dummy/public/404.html
411
+ - spec/dummy/db/schema.rb
412
+ - spec/dummy/db/migrate/20140522110454_add_o_auth_fields_to_accounts.rb
413
+ - spec/dummy/db/migrate/20181130062650_add_o_auth_fields_to_multi_applications_accounts.rb
414
+ - spec/dummy/db/migrate/20181130063056_create_applications.rb
415
+ - spec/dummy/db/migrate/20181130063104_add_credentials_fields_to_applications.rb
416
+ - spec/dummy/db/migrate/20140522110326_create_accounts.rb
417
+ - spec/dummy/db/migrate/20181130062531_create_multi_applications_accounts.rb
418
+ - spec/dummy/log/test.log
419
+ - spec/dummy/log/development.log
420
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/50/502uMBbq2ELFXg5u1vtykxQ_whhsdgQnmTwNA96niD0.cache
421
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yW/yWlGtA8E8Li2epEGqbxtvBeb5h0e52XZQ8xKiMXgDOY.cache
422
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/6F/6F2x1Bu3NKSTCTwUS6iCRFhKRT_ntZMzmPIMnVGabK4.cache
423
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_o/_okSFa_t7W5YJBZTW7ZitTwnmAFYgJup7tpTYum0Udo.cache
424
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/v9/v9HWdIdg3uuXOOqxWg8Y6aWxzqbywfxecFSDm5ilUs8.cache
425
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/y4/y4-jRuYEQUuCPpXrCIiCC1lgXmW4pm12ZEla-d56noA.cache
426
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3J/3JfiofMyqvbHq3sZznFIDsFS81fHxyAWoCXJLrtrWP4.cache
427
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/5s/5sm0UHvqondwU5MMfjMuqvLW2WQ6S7ylUf9PNw2uCTc.cache
428
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Sm/SmJRxdUchUsyyMi6zvsdwrcRR1hfQ9YeSZNKNM-n5lw.cache
429
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ze/ZelUAL6jLQcQiGZUfnAbvuJbU9OAqHiXV_Ccu8lToho.cache
430
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/u-/u-Iidm4zcU2RFkiqJFQkLTBxXuEoF5gCeJM4V5-3Qyc.cache
431
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_S/_SxbUQwhqQU8951QbOA6ZZ41F0d9D-VhhQqUE4BCryQ.cache
432
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/6g/6gkpMq6BGSOyooWUFJJQCs2k3-tT0WID6Vg4wknhJoM.cache
433
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/m8/m8I0GZ1puWB4hISNebXEGDX3G5QkoSVWHP4SiRvN-3Y.cache
434
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Go/Gohhb2B4rJ5hYmGM-VhZxS5dB_NFtsEAdbP1kTKDUeU.cache
435
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/bk/bk_rOYlFWoHkh4HHsvbxeo8rSvDWRX6cCbVlO2VCVNA.cache
436
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/aJ/aJ4EkukIrCHlOkA1WpQIasGGosjGkOKvRMsfcNQx1QQ.cache
437
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache
438
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/NS/NSFU7p8JOb9tHDvG74s3jdRt4ONYZoCTluL3HEsrPxc.cache
439
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Gg/Gg6i-z0G_WiBfMUE_gmveurGXQff5_TlQi29HwQcZ-8.cache
440
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNaj9zqaawn26kC4FL9ECzN5lkppnwTTQ93MIeJRKZg.cache
441
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mNEeM32MBaqiZ0_N_eheQR9oimoBpmcXRXr5puTAh3o.cache
442
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mn/mnJy7Ei2tJLs8tfmmUHjtWmfk2yfl1opoYG7Deg2bWQ.cache
443
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/E2/E2tGPoiGjrMuq9vL-ndjkozskpSFwLcGQXxJf_dl4z0.cache
444
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/f3/f3VckKo5w8mrxeqmzwLfZr7f6sj0dA8xZrFq3GMF0ig.cache
445
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jH/jHvwYeln0CEBatCDHIjJMF0vIdmuDmS_eTKNxFhOmlA.cache
446
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oY/oYCeXuzhz0IQEBtepScpQ7HlUp5yVleUE6BOLsnhXwA.cache
447
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache
448
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jU/jUktWNbR4V7n34UAZe7uJpmEofhflF0bVtIO2BgxyJ8.cache
449
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/EV/EVkLQJ6idLBSbQnkUelhejMxSOql0wh2QbtfKpdJiak.cache
450
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cO/cOGLhXoKF0BumBbtviyCY1xusm_WMEMhGSWY9qFekRU.cache
451
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/le/lekrQ_bDFewtYzH2xoA2tovuPzYdoSwnauQ4MgDwb0U.cache
452
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/OX/OXQFRQZ5OA2i3YtnP1fZ96aWeUC3_IIqO4fAMdR9FsM.cache
453
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/IH/IHM0sjf5lujHT6BG1cYKLB0rdqCd1KYYR5SLZkxXi1k.cache
454
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache
455
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RRXzNBrpSlU0RGhaxTSE_1GoRrV4JkWqF0ZoOf9xtzQ.cache
456
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache
457
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/w2/w2izaLMTzGRpPOq1R_Yl-0Ma7hm7tej5kSjV9khvFSk.cache
458
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2F/2FjAKNLL-jC6FeYfXsL0M8jItncHQcdDy239KNsTZQs.cache
459
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2_/2_hJriYgvh3UGtv5NMhrnkrtfpJlyTuQ4F5jYdVf8sQ.cache
460
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/R-/R-onhPbfjYnU6tM9fR0wZkXDSvCLrY5G1wyNCSVmKEs.cache
461
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yZ/yZRcLaNBQxCgGewY_IaXZrXG1YmOhr1iSxfZ-4MMK9Y.cache
462
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/zU/zUYxN3uLSvSCpp561lMJSJXPGanKNgxT32rw-w5jpPs.cache
463
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z9/Z9d8_EzLy9N7tx_nHmbmBF5LzFtW_0sik4AH1IFBX0Y.cache
464
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Zr/Zr7RfTTM_QNQ-7MuSD-M0rF18yH25tCSI9G4H5yYjAQ.cache
465
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/uX/uXHfYanP3WS7whlKHqs0pLBkEQwj_IGbfmktFdHfZ_A.cache
466
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3f/3fwING3B2z9NOnWMwdXFatlVw06vge46KkOWOII0KlU.cache
467
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ps/PsVVU35DPe0tSyJ1zEoiPaaJiwo6NclhO2OKuFSn76A.cache
468
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z-/Z-P7NJ7vzHin8mjLSAoWJW6FZfd6xwWS3xuoCX0DE40.cache
469
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Su/Sue46_TUXTlImzpNh2bkqDFL5cQ08rCAcaaJqlWI7qg.cache
470
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/uK/uKpQUG2ys9fKuyfsrw1Payh72LhuIrYJXep13nTbIIc.cache
471
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/0A/0AkQ3CITU4KXnU7GsiDQLAWeLkJApWK8LSS1j7wEk2I.cache
472
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfiLjztc-8aILuCwNaYiWOika9XKeEiGNJJJK_LCEr4.cache
473
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/gD/gDQJ-WkVLldqzYHKOLkamKeU-sTkDscHqOQawz7a6m4.cache
474
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/jb/jb46fu3q3DLQ7TFyiuaXmL_CPF7cQst2RgrF0xVyGtA.cache
475
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oS/oS5JF4El36MylOD0SJtv4YV-fsqNzd89t1IqlBzwYes.cache
476
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cq/cqMX8l9XlG5jEWd0fWjA7MTlj21d6dzcnhhOq08uFHY.cache
477
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/oZ/oZDDUJWB1xgHo4uv_iiUCtutWZ6LeJykII3cNkmd_bA.cache
478
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/eO/eOY3YH36a6yvdznpQqACMiI0e1CcTwPiEjUdhRfmm9k.cache
479
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cc/CcghYxY4f6VUjmyR9LJJi0rYn2LXCdBR9t8Qn4SroL8.cache
480
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/CjEM6wfYwxY_zG--WNzelIKjC420AU9WpvQLgolQOPM.cache
481
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Cj/cJJ0QWQg4eJ37I13drpPfSy27rwN7iqiQYPswqRm_Po.cache
482
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/CM/CMaRV8szi0IicAXD33YjDgWpLw468X08ycoS-ndwO5o.cache
483
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/ENHTZiiuQ1cqn16401VaQQBp7b0gwZOA7_I-W5CL5ig.cache
484
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/cy/cyurAtFfq8D4ORO-aDATDzTKcBumJfgafhOUCbECuMw.cache
485
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Oi/OiV2J0lyHQgXCDgtmFPNLE59EbztPsv9MNy05s943Yw.cache
486
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/fS/fSn1A2ssuKdsdJ-uwH_i8bXBaWmbJd0wHd-Ob6pTPi0.cache
487
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/T1/T1lVNy8C6VpxjRsI38DgOfG7yIh3OohPWTNZmJb8CPo.cache
488
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rd/Rd_ZtA5c34XyxDbTpkN8_ZfF1x78s46DbRXLu0jqMgo.cache
489
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/1M/1MTKfLxlwDryDP9C4ksVeuOF5FekTW5EddfnaJ4ujrA.cache
490
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/4i/4iLsjcOzC2_Y0hxnbPKuyayJABeUFDSyIh4Ed9OA8Xw.cache
491
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/8K/8KNXqSB0siJpEjgLM64KpfTgX1FSbkYKxWso4jP9F6U.cache
492
+ - spec/dummy/tmp/restart.txt
277
493
  - spec/dummy/README.rdoc
278
- - spec/fixtures/accounts.yml
279
494
  - spec/models/account_spec.rb
280
- - spec/routing/oauth_routing_spec.rb
281
- - spec/spec_helper.rb
495
+ - spec/models/multi_application_account_spec.rb
496
+ - spec/models/application_spec.rb
282
497
  - spec/support/omniauth.rb
498
+ - spec/lib/bookingsync/engine/credentials_resolver_spec.rb
499
+ - spec/lib/bookingsync/engine/application_credentials_spec.rb
500
+ - spec/fixtures/accounts.yml
501
+ - spec/routing/oauth_routing_spec.rb
502
+ - spec/controllers/authenticated_controller_spec.rb
503
+ - spec/controllers/sessions_controller_spec.rb
504
+ - spec/helpers/auth_helpers_spec.rb