webhook_agent_spec.rb 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. require 'rails_helper'
  2. describe Agents::WebhookAgent do
  3. let(:agent) do
  4. _agent = Agents::WebhookAgent.new(:name => 'webhook',
  5. :options => { 'secret' => 'foobar', 'payload_path' => 'some_key' })
  6. _agent.user = users(:bob)
  7. _agent.save!
  8. _agent
  9. end
  10. let(:payload) { {'people' => [{ 'name' => 'bob' }, { 'name' => 'jon' }] } }
  11. describe 'receive_web_request' do
  12. it 'should create event if secret matches' do
  13. out = nil
  14. expect {
  15. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  16. }.to change { Event.count }.by(1)
  17. expect(out).to eq(['Event Created', 201])
  18. expect(Event.last.payload).to eq(payload)
  19. end
  20. it 'should be able to create multiple events when given an array' do
  21. out = nil
  22. agent.options['payload_path'] = 'some_key.people'
  23. expect {
  24. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  25. }.to change { Event.count }.by(2)
  26. expect(out).to eq(['Event Created', 201])
  27. expect(Event.last.payload).to eq({ 'name' => 'jon' })
  28. end
  29. it 'should not create event if secrets dont match' do
  30. out = nil
  31. expect {
  32. out = agent.receive_web_request({ 'secret' => 'bazbat', 'some_key' => payload }, "post", "text/html")
  33. }.to change { Event.count }.by(0)
  34. expect(out).to eq(['Not Authorized', 401])
  35. end
  36. describe "receiving events" do
  37. context "default settings" do
  38. it "should not accept GET" do
  39. out = nil
  40. expect {
  41. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  42. }.to change { Event.count }.by(0)
  43. expect(out).to eq(['Please use POST requests only', 401])
  44. end
  45. it "should accept POST" do
  46. out = nil
  47. expect {
  48. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  49. }.to change { Event.count }.by(1)
  50. expect(out).to eq(['Event Created', 201])
  51. end
  52. end
  53. context "accepting get and post" do
  54. before { agent.options['verbs'] = 'get,post' }
  55. it "should accept GET" do
  56. out = nil
  57. expect {
  58. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  59. }.to change { Event.count }.by(1)
  60. expect(out).to eq(['Event Created', 201])
  61. end
  62. it "should accept POST" do
  63. out = nil
  64. expect {
  65. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  66. }.to change { Event.count }.by(1)
  67. expect(out).to eq(['Event Created', 201])
  68. end
  69. it "should not accept PUT" do
  70. out = nil
  71. expect {
  72. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "put", "text/html")
  73. }.to change { Event.count }.by(0)
  74. expect(out).to eq(['Please use GET/POST requests only', 401])
  75. end
  76. end
  77. context "accepting only get" do
  78. before { agent.options['verbs'] = 'get' }
  79. it "should accept GET" do
  80. out = nil
  81. expect {
  82. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  83. }.to change { Event.count }.by(1)
  84. expect(out).to eq(['Event Created', 201])
  85. end
  86. it "should not accept POST" do
  87. out = nil
  88. expect {
  89. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  90. }.to change { Event.count }.by(0)
  91. expect(out).to eq(['Please use GET requests only', 401])
  92. end
  93. end
  94. context "accepting only post" do
  95. before { agent.options['verbs'] = 'post' }
  96. it "should not accept GET" do
  97. out = nil
  98. expect {
  99. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  100. }.to change { Event.count }.by(0)
  101. expect(out).to eq(['Please use POST requests only', 401])
  102. end
  103. it "should accept POST" do
  104. out = nil
  105. expect {
  106. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  107. }.to change { Event.count }.by(1)
  108. expect(out).to eq(['Event Created', 201])
  109. end
  110. end
  111. context "accepting only put" do
  112. before { agent.options['verbs'] = 'put' }
  113. it "should accept PUT" do
  114. out = nil
  115. expect {
  116. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "put", "text/html")
  117. }.to change { Event.count }.by(1)
  118. expect(out).to eq(['Event Created', 201])
  119. end
  120. it "should not accept GET" do
  121. out = nil
  122. expect {
  123. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  124. }.to change { Event.count }.by(0)
  125. expect(out).to eq(['Please use PUT requests only', 401])
  126. end
  127. it "should not accept POST" do
  128. out = nil
  129. expect {
  130. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  131. }.to change { Event.count }.by(0)
  132. expect(out).to eq(['Please use PUT requests only', 401])
  133. end
  134. end
  135. context "flaky content with commas" do
  136. before { agent.options['verbs'] = ',, PUT,POST, gEt , ,' }
  137. it "should accept PUT" do
  138. out = nil
  139. expect {
  140. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "put", "text/html")
  141. }.to change { Event.count }.by(1)
  142. expect(out).to eq(['Event Created', 201])
  143. end
  144. it "should accept GET" do
  145. out = nil
  146. expect {
  147. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "get", "text/html")
  148. }.to change { Event.count }.by(1)
  149. expect(out).to eq(['Event Created', 201])
  150. end
  151. it "should accept POST" do
  152. out = nil
  153. expect {
  154. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "post", "text/html")
  155. }.to change { Event.count }.by(1)
  156. expect(out).to eq(['Event Created', 201])
  157. end
  158. it "should not accept DELETE" do
  159. out = nil
  160. expect {
  161. out = agent.receive_web_request({ 'secret' => 'foobar', 'some_key' => payload }, "delete", "text/html")
  162. }.to change { Event.count }.by(0)
  163. expect(out).to eq(['Please use PUT/POST/GET requests only', 401])
  164. end
  165. end
  166. end
  167. end
  168. end