stealth 1.0.3 → 1.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aee7236c0ff0afce9f29f067802b34bf412189f995e59b284dc4e03f2216e2dc
4
- data.tar.gz: bb4f56ec2bea359aa040a57f6ddda50fed0d8be61333cc05f0f64832839e190f
3
+ metadata.gz: cb5b41def6c4e13619ace50cff93ef042e41907d847d5bc391342a07b659c12f
4
+ data.tar.gz: edff40b0be61bb0ce35db7376b85fcbeb287daadb0a936266c0fb3ba2a442b11
5
5
  SHA512:
6
- metadata.gz: 7185cb82248979039e11210b0a5a952e2973aef404f9d2717494f0045df1da7e225021b6b1134cb72c3335c7c9926ce32d641a510c4b52a0c359cfe9a3deda37
7
- data.tar.gz: f137a529a1ef04b6803fb145bda12992991a57ff970c20b539ed49b78472285a4ac7e47cb08a4a2fabcc2336f8d01648b9a1f6df124cbf6857918facd1e6393d
6
+ metadata.gz: d41a57396b557409239312b03ed2009630a0b8d9396f97a5b5582ef6a9d7a68fc76696bf3ea7629a1af9fab3f3ccb9b2dd0b53db8f32cb9376c7b7769b289a75
7
+ data.tar.gz: 490adbca626688b0af47b89d857cf7bb14a307b49b1a6b92012d49b2eec5d5fc09f5176a5976b493f772af1c6fdc8c91cd8995d7cc08f8843db853135a09dd1c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stealth (1.0.2)
4
+ stealth (1.0.3)
5
5
  activerecord (~> 5.2)
6
6
  activesupport (~> 5.2)
7
7
  multi_json (~> 1.12)
@@ -56,7 +56,7 @@ GEM
56
56
  mock_redis (0.17.3)
57
57
  multi_json (1.13.1)
58
58
  mustermann (1.0.2)
59
- nokogiri (1.8.3)
59
+ nokogiri (1.8.4)
60
60
  mini_portile2 (~> 2.3.0)
61
61
  oj (3.5.0)
62
62
  puma (3.11.4)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.0.4
@@ -13,10 +13,10 @@ module Stealth
13
13
  error_level = fetch_error_level
14
14
  Stealth::Logger.l(topic: "catch_all", message: "CatchAll #{calculate_catch_all_state(error_level)} triggered for #{error_slug}: #{reason}")
15
15
 
16
- if defined?(CatchAllsController) && defined?(CatchAllFlow)
16
+ if defined?(CatchAllsController) && FlowMap.flow_spec[:catch_all].present?
17
17
  catch_all_state = calculate_catch_all_state(error_level)
18
18
 
19
- if CatchAllFlow.flow_spec.states.keys.include?(catch_all_state.to_sym)
19
+ if FlowMap.flow_spec[:catch_all].states.keys.include?(catch_all_state.to_sym)
20
20
  step_to flow: 'catch_all', state: catch_all_state
21
21
  else
22
22
  # We are out of bounds, do nothing to prevent an infinite loop
@@ -63,7 +63,7 @@ module Stealth
63
63
  flow_controller.send(@action_name)
64
64
  run_catch_all(reason: 'Did not send replies, update session, or step') unless flow_controller.progressed?
65
65
  rescue StandardError => e
66
- Stealth::Logger.l(topic: "catch_all", message: e.backtrace)
66
+ Stealth::Logger.l(topic: "catch_all", message: e.backtrace.join("\n"))
67
67
  run_catch_all(reason: e.message)
68
68
  end
69
69
  end
@@ -0,0 +1,101 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '/spec_helper'))
5
+
6
+ describe "Stealth::Controller::CatchAll" do
7
+
8
+ class VadersController < Stealth::Controller
9
+ def my_action
10
+ raise "oops"
11
+ end
12
+
13
+ def my_action2
14
+
15
+ end
16
+
17
+ def my_action3
18
+
19
+ end
20
+ end
21
+
22
+ class StubbedCatchAllsController < Stealth::Controller
23
+ def level1
24
+
25
+ end
26
+
27
+ def level2
28
+
29
+ end
30
+
31
+ def level3
32
+
33
+ end
34
+ end
35
+
36
+ class FlowMap
37
+ include Stealth::Flow
38
+
39
+ flow :vader do
40
+ state :my_action
41
+ state :my_action2
42
+ state :my_action3
43
+ end
44
+
45
+ flow :catch_all do
46
+ state :level1
47
+ state :level2
48
+ state :level3
49
+ end
50
+ end
51
+
52
+ let(:facebook_message) { SampleMessage.new(service: 'facebook') }
53
+ let(:controller) { VadersController.new(service_message: facebook_message.message_with_text) }
54
+
55
+ describe "when a CatchAll flow is defined" do
56
+ before(:each) do
57
+ stub_const("CatchAllsController", StubbedCatchAllsController)
58
+ end
59
+
60
+ after(:each) do
61
+ $redis.flushdb
62
+ end
63
+
64
+ it "should step_to catch_all->level1 when a StandardError is raised" do
65
+ controller.action(action: :my_action)
66
+ expect(controller.current_session.flow_string).to eq("catch_all")
67
+ expect(controller.current_session.state_string).to eq("level1")
68
+ end
69
+
70
+ it "should step_to catch_all->level1 when an action doesn't progress the flow" do
71
+ controller.action(action: :my_action2)
72
+ expect(controller.current_session.flow_string).to eq("catch_all")
73
+ expect(controller.current_session.state_string).to eq("level1")
74
+ end
75
+
76
+ it "should step_to catch_all->level2 when an action raises back to back" do
77
+ controller.step_to flow: :vader, state: :my_action
78
+ controller.step_to flow: :vader, state: :my_action
79
+ expect(controller.current_session.flow_string).to eq("catch_all")
80
+ expect(controller.current_session.state_string).to eq("level2")
81
+ end
82
+
83
+ it "should step_to catch_all->level3 when an action raises back to back to back" do
84
+ controller.step_to flow: :vader, state: :my_action
85
+ controller.step_to flow: :vader, state: :my_action
86
+ controller.step_to flow: :vader, state: :my_action
87
+ expect(controller.current_session.flow_string).to eq("catch_all")
88
+ expect(controller.current_session.state_string).to eq("level3")
89
+ end
90
+
91
+ it "should just stop after the maximum number of catch_all levels have been reached" do
92
+ controller.step_to flow: :vader, state: :my_action
93
+ controller.step_to flow: :vader, state: :my_action
94
+ controller.step_to flow: :vader, state: :my_action
95
+ controller.step_to flow: :vader, state: :my_action
96
+ expect(controller.current_session.flow_string).to eq("vader")
97
+ expect(controller.current_session.state_string).to eq("my_action")
98
+ end
99
+ end
100
+ end
101
+
@@ -345,4 +345,55 @@ describe "Stealth::Controller" do
345
345
  end
346
346
  end
347
347
 
348
+ describe "progressed?" do
349
+ it "should be truthy if an action calls step_to" do
350
+ expect(controller.progressed?).to be_falsey
351
+ controller.step_to flow: "mr_robot"
352
+ expect(controller.progressed?).to be_truthy
353
+ end
354
+
355
+ it "should be falsey if an action only calls step_to_at" do
356
+ expect(controller.progressed?).to be_falsey
357
+
358
+ expect(Stealth::ScheduledReplyJob).to receive(:perform_at)
359
+ controller.step_to_at (DateTime.now + 10.hours), flow: 'mr_robot'
360
+
361
+ expect(controller.progressed?).to be_falsey
362
+ end
363
+
364
+ it "should be falsey if an action only calls step_to_in" do
365
+ expect(controller.progressed?).to be_falsey
366
+
367
+ expect(Stealth::ScheduledReplyJob).to receive(:perform_in)
368
+ controller.step_to_in 100.seconds, flow: 'mr_robot'
369
+
370
+ expect(controller.progressed?).to be_falsey
371
+ end
372
+
373
+ it "should be truthy if an action calls update_session_to" do
374
+ expect(controller.progressed?).to be_falsey
375
+ controller.update_session_to flow: "mr_robot"
376
+ expect(controller.progressed?).to be_truthy
377
+ end
378
+
379
+ it "should be truthy if an action sends replies" do
380
+ expect(controller.progressed?).to be_falsey
381
+
382
+ # Stub out a service reply -- we just want send_replies to succeed here
383
+ stubbed_service_reply = double("service_reply")
384
+ allow(controller).to receive(:action_replies).and_return([], :erb)
385
+ allow(stubbed_service_reply).to receive(:replies).and_return([])
386
+ allow(Stealth::ServiceReply).to receive(:new).and_return(stubbed_service_reply)
387
+
388
+ controller.send_replies
389
+ expect(controller.progressed?).to be_truthy
390
+ end
391
+
392
+ it "should be falsey otherwise" do
393
+ expect(controller.progressed?).to be_falsey
394
+ controller.action(action: :other_action)
395
+ expect(controller.progressed?).to be_falsey
396
+ end
397
+ end
398
+
348
399
  end
@@ -34,6 +34,21 @@ describe "Stealth::Controller replies" do
34
34
  def say_offer
35
35
  send_replies
36
36
  end
37
+
38
+ def say_uh_oh
39
+ send_replies
40
+ end
41
+ end
42
+
43
+ describe "missing reply" do
44
+ it "should raise a Stealth::Errors::ReplyNotFound" do
45
+ allow(controller.current_session).to receive(:flow_string).and_return("message")
46
+ allow(controller.current_session).to receive(:state_string).and_return("say_uh_oh")
47
+
48
+ expect {
49
+ controller.send_replies
50
+ }.to raise_error(Stealth::Errors::ReplyNotFound)
51
+ end
37
52
  end
38
53
 
39
54
  describe "class attributes" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stealth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauricio Gomes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-06-20 00:00:00.000000000 Z
12
+ date: 2018-08-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -284,6 +284,7 @@ files:
284
284
  - logo.svg
285
285
  - spec/configuration_spec.rb
286
286
  - spec/controller/callbacks_spec.rb
287
+ - spec/controller/catch_all_spec.rb
287
288
  - spec/controller/controller_spec.rb
288
289
  - spec/controller/helpers_spec.rb
289
290
  - spec/controller/replies_spec.rb
@@ -332,6 +333,7 @@ summary: Ruby framework for conversational bots
332
333
  test_files:
333
334
  - spec/configuration_spec.rb
334
335
  - spec/controller/callbacks_spec.rb
336
+ - spec/controller/catch_all_spec.rb
335
337
  - spec/controller/controller_spec.rb
336
338
  - spec/controller/helpers_spec.rb
337
339
  - spec/controller/replies_spec.rb