bookingsync-engine 3.0.2 → 4.0.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.
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