text_spec 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in text_spec.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :cli => "--color", :notification => true do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,10 @@
1
+ puts "Added text_spec helpers and matchers to world"
2
+
3
+
4
+ After do
5
+ puts "clearing text_messages"
6
+ TextSpec::Data.clear_messages
7
+ end
8
+
9
+ World(TextSpec::Helpers)
10
+ World(TextSpec::Matchers)
@@ -0,0 +1,43 @@
1
+ require 'text_spec/util'
2
+
3
+ module TextSpec
4
+ class Data
5
+ extend TextSpec::Util
6
+
7
+ def self.add_message message
8
+ @@messages ||= []
9
+ @@messages << message
10
+ end
11
+
12
+ def self.clear_messages
13
+ @@messages = []
14
+ @@current_text_message = nil
15
+ end
16
+
17
+ def self.messages
18
+ @@messages ||= []
19
+ end
20
+
21
+ def self.set_current_number(number)
22
+ @@current_number = sanitize number
23
+ end
24
+
25
+ def self.current_number
26
+ @@current_number
27
+ end
28
+
29
+ def self.current_text_message
30
+ @@current_text_message ||= nil
31
+ end
32
+
33
+ def self.open_last_text_message_for(phone_number)
34
+ message = messages_for(phone_number).first
35
+ @@current_text_message = @@messages.delete(message)
36
+ end
37
+
38
+ def self.messages_for(phone_number)
39
+ @@messages.select {|m| m.number == sanitize(phone_number)}
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ class Twilio::REST::Client
2
+
3
+ def initialize(account_sid, auth_token)
4
+ end
5
+
6
+ class Messages
7
+ include TextSpec::Helpers
8
+
9
+ def create(opts={})
10
+ to = opts[:to]
11
+ body = opts[:body]
12
+ add_message Message.new(:number => to, :body => body)
13
+ end
14
+ end
15
+
16
+ class Sms
17
+ def messages
18
+ return Messages.new
19
+ end
20
+ end
21
+
22
+ class Account
23
+ def sms
24
+ return Sms.new
25
+ end
26
+ end
27
+
28
+ def account
29
+ return Account.new
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ require 'forwardable'
2
+
3
+ module TextSpec
4
+ module Helpers
5
+ extend Forwardable
6
+
7
+ def_delegators :"TextSpec::Data",
8
+ :messages,
9
+ :add_message,
10
+ :set_current_number,
11
+ :current_number,
12
+ :clear_messages,
13
+ :current_text_message,
14
+ :messages_for,
15
+ :open_last_text_message_for
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module TextSpec
2
+ module Matchers
3
+
4
+ RSpec::Matchers.define :have_text_messages do
5
+ match do |mobile_device|
6
+ mobile_device.messages.count > 0
7
+ end
8
+
9
+ failure_message_for_should do |mobile_device|
10
+ "expected the mobile device '#{mobile_device.number}' to have text messages but it did not"
11
+ end
12
+
13
+ failure_message_for_should_not do |mobile_device|
14
+ "expected the mobile device '#{mobile_device.number}' to have no text messages but it did"
15
+ end
16
+ end
17
+
18
+ RSpec::Matchers.define :have_body do |expected_body|
19
+ match do |message|
20
+ message.body == expected_body
21
+ end
22
+
23
+ #failure_message_for_should do |mobile_device|
24
+ #"expected the mobile device '#{mobile_device.number}' to have text messages but it did not"
25
+ #end
26
+
27
+ #failure_message_for_should_not do |mobile_device|
28
+ #"expected the mobile device '#{mobile_device.number}' to have no text messages but it did"
29
+ #end
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ class Message
2
+ attr_accessor :number
3
+ attr_accessor :body
4
+
5
+ include TextSpec::Util
6
+
7
+ def initialize(opts={})
8
+ @number = sanitize opts[:number]
9
+ @body = opts[:body]
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class MobileDevice
2
+
3
+ def initialize(number)
4
+ @number = number
5
+ end
6
+
7
+ def messages
8
+ TextSpec::Data.messages.select {|d| d.number == @number}
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module TextSpec
2
+ module Util
3
+ def sanitize number
4
+ number.gsub(/^\+*1/, "").gsub("-", "")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module TextSpec
2
+ VERSION = "0.0.1"
3
+ end
data/lib/text_spec.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'rspec'
2
+ require "text_spec/version"
3
+ require "text_spec/helpers"
4
+ require "text_spec/data"
5
+ require "text_spec/message"
6
+ require "text_spec/util"
7
+ require "text_spec/mobile_device"
8
+ require "text_spec/matchers"
9
+ #require "text_spec/drivers/twilio-ruby"
10
+
11
+ module TextSpec
12
+ def self.driver=(driver_sym)
13
+ require "text_spec/drivers/#{driver_sym.to_s}"
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ # -------------------------------------------
2
+ # Available methods
3
+ # -------------------------------------------
4
+
5
+ # messages
6
+ # add_message
7
+ # set_current_number
8
+ # current_number
9
+ # clear_messages
10
+ # current_text_message
11
+ # open_last_text_message_for
12
+
13
+
14
+ Given /^no text messages have been sent$/ do
15
+ clear_messages
16
+ end
17
+
18
+ Given /^all text messages have been read$/ do
19
+ clear_messages
20
+ end
21
+
22
+ Then /^"([^"]*)" should receive a text message$/ do |phone_number|
23
+ messages_for(phone_number).should_not be_empty
24
+ end
25
+
26
+ Then /^"([^"]*)" should receive no text messages$/ do |phone_number|
27
+ messages_for(phone_number).should be_empty
28
+ end
29
+
30
+ When /^"([^"]*?)" opens? the text message$/ do |mobile_number|
31
+ open_last_text_message_for(mobile_number)
32
+ end
33
+
34
+ Then /^I should see "([^"]*)" in the text message body$/ do |content|
35
+ current_text_message.should have_body(content)
36
+ end
@@ -0,0 +1,14 @@
1
+ base = defined?(Rails) ? Rails::Generator::Base : RubiGen::Base
2
+
3
+ class TextSpecGenerator < base
4
+ def manifest
5
+ m.directory 'features/step_definitions'
6
+ m.file 'text_message_steps.rb', 'features/step_definitions/text_message_steps.rb'
7
+ end
8
+
9
+ protected
10
+
11
+ def banner
12
+ "Usage: #{0} text_spec"
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), *%w[spec_helper])
2
+ require 'twilio-ruby'
3
+
4
+ describe TextSpec do
5
+ include TextSpec::Helpers
6
+
7
+ before :each do
8
+ TextSpec::Data.clear_messages
9
+ end
10
+
11
+
12
+ describe "the twilio-ruby driver" do
13
+ it "is assignable" do
14
+ TextSpec.driver = :"twilio-ruby"
15
+ end
16
+
17
+ it "intercepts calls to twilio's sms client" do
18
+ account_sid = 'ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
19
+ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
20
+
21
+ @client = Twilio::REST::Client.new account_sid, auth_token
22
+ @client.account.sms.messages.create(
23
+ :from => '+14159341234',
24
+ :to => '+16105557069',
25
+ :body => 'Hey there!'
26
+ )
27
+
28
+ open_last_text_message_for("+16105557069")
29
+ current_text_message.should_not be_nil
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,96 @@
1
+ require File.join(File.dirname(__FILE__), *%w[spec_helper])
2
+
3
+ describe TextSpec::Helpers do
4
+ include TextSpec::Helpers
5
+
6
+ before :each do
7
+ TextSpec::Data.clear_messages
8
+ end
9
+
10
+ describe ".messages" do
11
+ describe "before any messages have been sent" do
12
+ it "is empty" do
13
+ messages.should be_empty
14
+ end
15
+ end
16
+
17
+ describe "after a message has been sent" do
18
+ it "adds a message" do
19
+ lambda {
20
+ add_message Message.new :number => "5555555512", :body => "Hello there"
21
+ }.should change(messages, :count).by(1)
22
+ end
23
+ end
24
+ end
25
+
26
+ describe ".set_current_number" do
27
+ it "assigns the current number" do
28
+ set_current_number "555551234"
29
+ current_number.should == "555551234"
30
+ end
31
+
32
+ it "sanitizes phone nubmers" do
33
+ set_current_number "+1555551234"
34
+ current_number.should == "555551234"
35
+
36
+ set_current_number "1-616-555-2929"
37
+ current_number.should == "6165552929"
38
+ end
39
+ end
40
+
41
+ describe ".clear_sms_messages" do
42
+ it "removes all messages" do
43
+ add_message Message.new :number => "5555555512", :body => "Hello there"
44
+ add_message Message.new :number => "5555555512", :body => "Hello there"
45
+ add_message Message.new :number => "5555555512", :body => "Hello there"
46
+
47
+ messages.should have(3).messages
48
+ end
49
+ end
50
+
51
+ describe ".current_text_message" do
52
+ describe "when there are not text messages yet" do
53
+ before :each do
54
+ TextSpec::Data.clear_messages
55
+ end
56
+
57
+ it "returns nil" do
58
+ current_text_message.should be_nil
59
+ end
60
+ end
61
+
62
+ describe "when there are messages" do
63
+ let(:message1) { Message.new :number => "5555555513", :body => "Hi" }
64
+ let(:message2) { Message.new :number => "5555555512", :body => "Hello there" }
65
+
66
+ before do
67
+ add_message message1
68
+ add_message message2
69
+ end
70
+
71
+ describe "and no messages have been opened" do
72
+ it "should be nil" do
73
+ current_text_message.should be_nil
74
+ end
75
+ end
76
+
77
+ describe "and a message has been opened" do
78
+ before do
79
+ open_last_text_message_for("5555555513")
80
+ end
81
+
82
+ it "returns the last open text message" do
83
+ current_text_message.should == message1
84
+
85
+ open_last_text_message_for("5555555513")
86
+ current_text_message.should be_nil
87
+
88
+ open_last_text_message_for("5555555512")
89
+ current_text_message.should == message2
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,70 @@
1
+ require File.join(File.dirname(__FILE__), *%w[spec_helper])
2
+
3
+ describe TextSpec::Matchers do
4
+ include TextSpec::Helpers
5
+ include TextSpec::Matchers
6
+
7
+ let(:mobile_number) { "5555555512" }
8
+
9
+ class MatcherMatch
10
+ def initialize(object_to_test_match)
11
+ @object_to_test_match = object_to_test_match
12
+ end
13
+
14
+ def description
15
+ "match when provided #{@object_to_test_match.inspect}"
16
+ end
17
+
18
+ def matches?(matcher)
19
+ @matcher = matcher
20
+ matcher.matches?(@object_to_test_match)
21
+ end
22
+
23
+ def failure_message
24
+ "expected #{@matcher.inspect} to match when provided #{@object_to_test_match.inspect}, but it did not"
25
+ end
26
+
27
+ def negative_failure_message
28
+ "expected #{@matcher.inspect} not to match when provided #{@object_to_test_match.inspect}, but it did"
29
+ end
30
+ end
31
+
32
+ def match(object_to_test_match)
33
+ if object_to_test_match.is_a?(Regexp)
34
+ super # delegate to rspec's built in 'match' matcher
35
+ else
36
+ MatcherMatch.new(object_to_test_match)
37
+ end
38
+ end
39
+
40
+ describe ".have_text_messages" do
41
+ include TextSpec::Matchers
42
+
43
+ describe "when the mobile device has no text messages" do
44
+ it "should not match" do
45
+ device = MobileDevice.new(:number => mobile_number)
46
+ have_text_messages.should_not match(device)
47
+ end
48
+ end
49
+
50
+ describe "when the mobile device has text messages" do
51
+ it "should match" do
52
+ add_message Message.new(:number => mobile_number, :body => "something")
53
+
54
+ device = MobileDevice.new(mobile_number)
55
+ have_text_messages.should match(device)
56
+ end
57
+ end
58
+ end
59
+
60
+ describe ".have_body" do
61
+ describe "when bodies match" do
62
+ it "matches" do
63
+ message = Message.new(:number => mobile_number, :body => "something")
64
+
65
+ have_body("something").should match(message)
66
+ end
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. lib text_spec])
2
+
3
+ require 'rubygems'
4
+ require 'pry'
data/text_spec.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "text_spec/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "text_spec"
7
+ s.version = TextSpec::VERSION
8
+ s.authors = ["Chris Rittersdorf"]
9
+ s.email = ["manlycode@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Test SMS interactions with RSpec and Cucumber}
12
+ s.description = %q{Text Spec gives you an RSpec DSL and Cucumber steps to test SMS interactions (currently only usint the twilio-rb gem).}
13
+
14
+ s.rubyforge_project = "text_spec"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'rspec'
22
+
23
+ s.add_development_dependency "rspec"
24
+ s.add_development_dependency "twilio-ruby"
25
+ s.add_development_dependency "guard-rspec"
26
+ s.add_development_dependency "pry"
27
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: text_spec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Rittersdorf
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-05 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2168620540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2168620540
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &2168620060 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2168620060
36
+ - !ruby/object:Gem::Dependency
37
+ name: twilio-ruby
38
+ requirement: &2168619540 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2168619540
47
+ - !ruby/object:Gem::Dependency
48
+ name: guard-rspec
49
+ requirement: &2168618940 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2168618940
58
+ - !ruby/object:Gem::Dependency
59
+ name: pry
60
+ requirement: &2168618400 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2168618400
69
+ description: Text Spec gives you an RSpec DSL and Cucumber steps to test SMS interactions
70
+ (currently only usint the twilio-rb gem).
71
+ email:
72
+ - manlycode@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - Gemfile
79
+ - Guardfile
80
+ - Rakefile
81
+ - lib/text_spec.rb
82
+ - lib/text_spec/cucumber.rb
83
+ - lib/text_spec/data.rb
84
+ - lib/text_spec/drivers/twilio-ruby.rb
85
+ - lib/text_spec/helpers.rb
86
+ - lib/text_spec/matchers.rb
87
+ - lib/text_spec/message.rb
88
+ - lib/text_spec/mobile_device.rb
89
+ - lib/text_spec/util.rb
90
+ - lib/text_spec/version.rb
91
+ - rails_generators/text_spec/templates/text_message_steps.rb
92
+ - rails_generators/text_spec_generator.rb
93
+ - spec/drivers_spec.rb
94
+ - spec/helpers_spec.rb
95
+ - spec/matchers_spec.rb
96
+ - spec/spec_helper.rb
97
+ - text_spec.gemspec
98
+ homepage: ''
99
+ licenses: []
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project: text_spec
118
+ rubygems_version: 1.8.6
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Test SMS interactions with RSpec and Cucumber
122
+ test_files:
123
+ - spec/drivers_spec.rb
124
+ - spec/helpers_spec.rb
125
+ - spec/matchers_spec.rb
126
+ - spec/spec_helper.rb