bluebird 0.1.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.
@@ -0,0 +1,228 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bluebird::Strategies::Strip::Strategy do
4
+
5
+ before(:all) do
6
+ Bluebird.configure do |config|
7
+ config.max_length = 20
8
+ config.characters_reserved_per_media = 5
9
+ end
10
+ end
11
+
12
+ let!(:strategy) { Bluebird::Strategies::Strip::Strategy }
13
+ let(:config) { Bluebird::Config }
14
+
15
+ context 'When tweet is shorter than max' do
16
+ context 'and without leading whitespace' do
17
+ context 'and without trailing whitespace' do
18
+ context 'and without media' do
19
+ it 'does not modify the tweet' do
20
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
21
+ strategy.run(tweet, config)
22
+ expect(tweet.status).to eq 'Lorem ipsum'
23
+ end
24
+ end
25
+ context 'and with media' do
26
+ it 'does not modify the tweet' do
27
+ tweet = Bluebird::Tweet.new('Lorem ipsum', media: true)
28
+ strategy.run(tweet, config)
29
+ expect(tweet.status).to eq 'Lorem ipsum'
30
+ end
31
+ end
32
+ end
33
+ context 'and with trailing whitespace' do
34
+ context 'and without media' do
35
+ it 'does not modify the tweet' do
36
+ tweet = Bluebird::Tweet.new('Lorem ipsum ')
37
+ strategy.run(tweet, config)
38
+ expect(tweet.status).to eq 'Lorem ipsum '
39
+ end
40
+ end
41
+ context 'and with media' do
42
+ it 'does not modify the tweet' do
43
+ tweet = Bluebird::Tweet.new('Lorem ', media: true)
44
+ strategy.run(tweet, config)
45
+ expect(tweet.status).to eq 'Lorem '
46
+ end
47
+ end
48
+ end
49
+ end
50
+ context 'and with leading whitespace' do
51
+ context 'and without trailing whitespace' do
52
+ context 'and without media' do
53
+ it 'does not modify the tweet' do
54
+ tweet = Bluebird::Tweet.new(' Lorem ipsum')
55
+ strategy.run(tweet, config)
56
+ expect(tweet.status).to eq ' Lorem ipsum'
57
+ end
58
+ end
59
+ context 'and with media' do
60
+ it 'does not modify the tweet' do
61
+ tweet = Bluebird::Tweet.new(' Lorem', media: true)
62
+ strategy.run(tweet, config)
63
+ expect(tweet.status).to eq ' Lorem'
64
+ end
65
+ end
66
+ end
67
+ context 'and with trailing whitespace' do
68
+ context 'and without media' do
69
+ it 'does not modify the tweet' do
70
+ tweet = Bluebird::Tweet.new(' Lorem ipsum ')
71
+ strategy.run(tweet, config)
72
+ expect(tweet.status).to eq ' Lorem ipsum '
73
+ end
74
+ end
75
+ context 'and with media' do
76
+ it 'does not modify the tweet' do
77
+ tweet = Bluebird::Tweet.new(' Lorem ', media: true)
78
+ strategy.run(tweet, config)
79
+ expect(tweet.status).to eq ' Lorem '
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'When tweet is longer than max' do
87
+ context 'and without leading whitespace' do
88
+ context 'and without trailing whitespace' do
89
+ context 'and without media' do
90
+ it 'does not modify the tweet' do
91
+ tweet = Bluebird::Tweet.new('Lorem ipsum dolor sit amet')
92
+ strategy.run(tweet, config)
93
+ expect(tweet.status).to eq 'Lorem ipsum dolor sit amet'
94
+ end
95
+ end
96
+ context 'and with media' do
97
+ it 'does not modify the tweet' do
98
+ tweet = Bluebird::Tweet.new('Lorem ipsum dolor sit amet', media: true)
99
+ strategy.run(tweet, config)
100
+ expect(tweet.status).to eq 'Lorem ipsum dolor sit amet'
101
+ end
102
+ end
103
+ end
104
+ context 'and with trailing whitespace' do
105
+ context 'and without media' do
106
+ it 'strips the tweet' do
107
+ tweet = Bluebird::Tweet.new('Lorem ipsum dolor sit amet ')
108
+ strategy.run(tweet, config)
109
+ expect(tweet.status).to eq 'Lorem ipsum dolor sit amet'
110
+ end
111
+ end
112
+ context 'and with media' do
113
+ it 'strips the tweet' do
114
+ tweet = Bluebird::Tweet.new('Lorem ipsum sit ', media: true)
115
+ strategy.run(tweet, config)
116
+ expect(tweet.status).to eq 'Lorem ipsum sit'
117
+ end
118
+ end
119
+ end
120
+ end
121
+ context 'and with leading whitespace' do
122
+ context 'and without trailing whitespace' do
123
+ context 'and without media' do
124
+ it 'strips the tweet' do
125
+ tweet = Bluebird::Tweet.new(' Lorem ipsum dolor sit amet')
126
+ strategy.run(tweet, config)
127
+ expect(tweet.status).to eq 'Lorem ipsum dolor sit amet'
128
+ end
129
+ end
130
+ context 'and without media' do
131
+ it 'strips the tweet' do
132
+ tweet = Bluebird::Tweet.new(' Lorem ipsum', media: true)
133
+ strategy.run(tweet, config)
134
+ expect(tweet.status).to eq 'Lorem ipsum'
135
+ end
136
+ end
137
+ end
138
+ context 'and with trailing whitespace' do
139
+ context 'and without media' do
140
+ it 'strips the tweet' do
141
+ tweet = Bluebird::Tweet.new(' Lorem ipsum dolor sit amet ')
142
+ strategy.run(tweet, config)
143
+ expect(tweet.status).to eq 'Lorem ipsum dolor sit amet'
144
+ end
145
+ end
146
+ context 'and without media' do
147
+ it 'strips the tweet' do
148
+ tweet = Bluebird::Tweet.new(' Lorem ipsum ', media: true)
149
+ strategy.run(tweet, config)
150
+ expect(tweet.status).to eq 'Lorem ipsum'
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ context "When tweet's length is equal to max" do
158
+ context 'and without leading whitespace' do
159
+ context 'and without trailing whitespace' do
160
+ context 'and without media' do
161
+ it 'does not modify the tweet' do
162
+ tweet = Bluebird::Tweet.new('Lorem ipsum dolor si')
163
+ strategy.run(tweet, config)
164
+ expect(tweet.status).to eq 'Lorem ipsum dolor si'
165
+ end
166
+ end
167
+ context 'and with media' do
168
+ it 'does not modify the tweet' do
169
+ tweet = Bluebird::Tweet.new('Lorem ipsum dol', media: true)
170
+ strategy.run(tweet, config)
171
+ expect(tweet.status).to eq 'Lorem ipsum dol'
172
+ end
173
+ end
174
+ end
175
+ context 'and with trailing whitespace' do
176
+ context 'and without media' do
177
+ it 'does not modify the tweet' do
178
+ tweet = Bluebird::Tweet.new('Lorem ipsum dolor ')
179
+ strategy.run(tweet, config)
180
+ expect(tweet.status).to eq 'Lorem ipsum dolor '
181
+ end
182
+ end
183
+ context 'and with media' do
184
+ it 'does not modify the tweet' do
185
+ tweet = Bluebird::Tweet.new('Lorem ipsum ', media: true)
186
+ strategy.run(tweet, config)
187
+ expect(tweet.status).to eq 'Lorem ipsum '
188
+ end
189
+ end
190
+ end
191
+ end
192
+ context 'and with leading whitespace' do
193
+ context 'and without trailing whitespace' do
194
+ context 'and without media' do
195
+ it 'does not modify the tweet' do
196
+ tweet = Bluebird::Tweet.new(' Lorem ipsum dolor')
197
+ strategy.run(tweet, config)
198
+ expect(tweet.status).to eq ' Lorem ipsum dolor'
199
+ end
200
+ end
201
+ context 'and with media' do
202
+ it 'does not modify the tweet' do
203
+ tweet = Bluebird::Tweet.new(' Lorem ipsumd', media: true)
204
+ strategy.run(tweet, config)
205
+ expect(tweet.status).to eq ' Lorem ipsumd'
206
+ end
207
+ end
208
+ end
209
+ context 'and with trailing whitespace' do
210
+ context 'and without media' do
211
+ it 'does not modify the tweet' do
212
+ tweet = Bluebird::Tweet.new(' Lorem ipsum dolo ')
213
+ strategy.run(tweet, config)
214
+ expect(tweet.status).to eq ' Lorem ipsum dolo '
215
+ end
216
+ end
217
+ context 'and with media' do
218
+ it 'does not modify the tweet' do
219
+ tweet = Bluebird::Tweet.new(' Loremi dolo ', media: true)
220
+ strategy.run(tweet, config)
221
+ expect(tweet.status).to eq ' Loremi dolo '
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ end
@@ -0,0 +1,188 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bluebird::Strategies::TruncateText::Strategy do
4
+
5
+ let!(:strategy) { Bluebird::Strategies::TruncateText::Strategy }
6
+
7
+ describe '#run?' do
8
+ it 'returns true if tweet is longer than max' do
9
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
10
+ expect(strategy.send(:run?, tweet, 10)).to be_true
11
+ end
12
+ it 'returns false if tweet is shorter than max' do
13
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
14
+ expect(strategy.send(:run?, tweet, 15)).to be_false
15
+ end
16
+ end
17
+
18
+ describe '#truncate' do
19
+
20
+ context 'When tweet is shorter than max' do
21
+ it 'does not modify the tweet' do
22
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor')
23
+ strategy.send(:truncate, tweet, 20)
24
+ expect(tweet.status).to eq 'Lorem #ipsum @dolor'
25
+ end
26
+ end
27
+
28
+ context "When tweet's length is equal to max" do
29
+ it 'does not modify the tweet' do
30
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor ')
31
+ strategy.send(:truncate, tweet, 20)
32
+ expect(tweet.status).to eq 'Lorem #ipsum @dolor '
33
+ end
34
+ end
35
+
36
+ context 'When tweet is longer than max' do
37
+ it 'truncates the text partial which can handle all the truncation' do
38
+ Bluebird::Config.truncate_text.omission = '...'
39
+ tweet = Bluebird::Tweet.new('Lorem ipsum #dolor sit #amet')
40
+ strategy.send(:truncate, tweet, 20)
41
+ expect(tweet.status).to eq '... #dolor sit #amet'
42
+ end
43
+ it 'does nothing if there is no text partial' do
44
+ tweet = Bluebird::Tweet.new('#Lorem @ipsum dolor.com #amet')
45
+ strategy.send(:truncate, tweet, 20)
46
+ expect(tweet.status).to eq '#Lorem @ipsum dolor.com #amet'
47
+ end
48
+ it 'truncates all text partials' do
49
+ tweet = Bluebird::Tweet.new('#Lorem ipsum dolor.com and #amet')
50
+ strategy.send(:truncate, tweet, 20)
51
+ expect(tweet.status).to eq '#Lorem dolor.com #amet'
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ describe '#truncate_partials' do
58
+
59
+ before(:all) { Bluebird::Config.truncate_text.omission = '...' }
60
+
61
+ it 'truncates the text partials' do
62
+ tweet = Bluebird::Tweet.new('Lorem ipsum @dolor sit')
63
+ strategy.send(:truncate_partials, tweet, 9)
64
+ expect(tweet.status).to eq 'Lor... @dolor'
65
+ end
66
+ it 'truncates the text partials' do
67
+ tweet = Bluebird::Tweet.new('Lorem ipsum @dolor sit #amet')
68
+ strategy.send(:truncate_partials, tweet, 9)
69
+ expect(tweet.status).to eq 'Lor... @dolor #amet'
70
+ end
71
+ end
72
+
73
+ describe '#truncate_partial' do
74
+ context 'When partial can handle whole truncation' do
75
+
76
+ it 'truncates the partial' do
77
+ partial = Bluebird::Partial.new('Lorem', :text)
78
+ strategy.send(:truncate_partial, partial, 3)
79
+ expect(partial.content).to eq 'Lo'
80
+ end
81
+
82
+ context 'and with trailing whitespace' do
83
+ context 'and without a trailing partial' do
84
+ it 'truncates the partial' do
85
+ partial = Bluebird::Partial.new('Lorem ', :text)
86
+ strategy.send(:truncate_partial, partial, 3)
87
+ expect(partial.content).to eq 'Lore'
88
+ end
89
+ end
90
+ context 'and with a trailing partial' do
91
+ it 'truncates the partial and keeps the trailing space' do
92
+ tweet = Bluebird::Tweet.new('Lorem @ipsum')
93
+ partial = tweet.partials[0]
94
+ strategy.send(:truncate_partial, partial, 3)
95
+ expect(partial.content).to eq 'Lo '
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'and partial is between two entities' do
101
+ it 'truncates the partial and adds a space' do
102
+ tweet = Bluebird::Tweet.new('#Lorem ipsum @dolor')
103
+ partial = tweet.partials[1]
104
+ strategy.send(:truncate_partial, partial, 6)
105
+ expect(partial.content).to eq ' '
106
+ end
107
+ end
108
+
109
+ end
110
+
111
+ context 'When partial cannot handle whole truncation' do
112
+ context 'and partial is a reply preventer' do
113
+ it 'truncates the partial and adds a dot to prevent replying' do
114
+ tweet = Bluebird::Tweet.new('Lorem @ipsum')
115
+ partial = tweet.partials[0]
116
+ strategy.send(:truncate_partial, partial, 6)
117
+ expect(partial.content).to eq '.'
118
+ end
119
+ end
120
+ context 'and partial is between two entities' do
121
+ it 'truncates the partial and adds a space' do
122
+ tweet = Bluebird::Tweet.new('#Lorem ipsum @dolor')
123
+ partial = tweet.partials[1]
124
+ strategy.send(:truncate_partial, partial, 8)
125
+ expect(partial.content).to eq ' '
126
+ end
127
+ end
128
+ context 'and partial can be deleted' do
129
+ it "deletes the partial's content" do
130
+ tweet = Bluebird::Tweet.new('#Lorem ipsum @dolor sit')
131
+ partial = tweet.partials[3]
132
+ strategy.send(:truncate_partial, partial, 5)
133
+ expect(partial.content).to eq ''
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#add_omission' do
140
+ context 'When omission is present' do
141
+
142
+ before(:all) { Bluebird::Config.truncate_text.omission = '...' }
143
+
144
+ context 'and partial can handle the omission' do
145
+
146
+ it 'adds the omission' do
147
+ partial = Bluebird::Partial.new('Lorem ipsum', :text)
148
+ strategy.send(:add_omission, partial)
149
+ expect(partial.content).to eq 'Lorem ip...'
150
+ end
151
+
152
+ context 'with trailing entity' do
153
+ it 'adds the omission before the whitespace' do
154
+ tweet = Bluebird::Tweet.new('Lorem ipsum http://www.example.com')
155
+ partial = tweet.partials[0]
156
+ strategy.send(:add_omission, partial)
157
+ expect(partial.content).to eq 'Lorem ip... '
158
+ end
159
+ end
160
+ end
161
+
162
+ context 'and partial cannot handle omission' do
163
+ it 'does not add omission' do
164
+ partial = Bluebird::Partial.new('Lor', :text)
165
+ strategy.send(:add_omission, partial)
166
+ expect(partial.content).to eq 'Lor'
167
+ end
168
+ end
169
+ end
170
+ context 'When omission is nil' do
171
+ it 'does not add omission' do
172
+ Bluebird::Config.truncate_text.omission = nil
173
+ partial = Bluebird::Partial.new('Lorem ipsum', :text)
174
+ strategy.send(:add_omission, partial)
175
+ expect(partial.content).to eq 'Lorem ipsum'
176
+ end
177
+ end
178
+ context 'When omission is false' do
179
+ it 'does not add omission' do
180
+ Bluebird::Config.truncate_text.omission = false
181
+ partial = Bluebird::Partial.new('Lorem ipsum', :text)
182
+ strategy.send(:add_omission, partial)
183
+ expect(partial.content).to eq 'Lorem ipsum'
184
+ end
185
+ end
186
+ end
187
+
188
+ end
@@ -0,0 +1,209 @@
1
+ #encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Bluebird::Tweet do
6
+
7
+ describe '#initialize' do
8
+ it 'sets original_status' do
9
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
10
+ expect(tweet.original_status).to eq 'Lorem ipsum'
11
+ end
12
+
13
+ it 'sets partials' do
14
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
15
+ expect(tweet.partials).to be_kind_of Array
16
+ end
17
+
18
+ context 'When media options is present' do
19
+ it 'sets the media' do
20
+ tweet = Bluebird::Tweet.new('Lorem ipsum', media: true)
21
+ expect(tweet.media).to be_true
22
+ end
23
+ end
24
+
25
+ context 'When media options is missing' do
26
+ it 'does not set the media' do
27
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
28
+ expect(tweet.media).to be_nil
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '#status' do
34
+ it 'returns the status of the tweet' do
35
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor $sit amet')
36
+ expect(tweet.status).to eq 'Lorem #ipsum @dolor $sit amet'
37
+ end
38
+ end
39
+
40
+ describe '#length' do
41
+ context 'When with media' do
42
+ it 'returns the length' do
43
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor $sit amet')
44
+ expect(tweet.length).to be 29
45
+ end
46
+ end
47
+ context 'When without media' do
48
+ it 'returns the length' do
49
+ Bluebird::Config.characters_reserved_per_media = 5
50
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor $sit amet', media: true)
51
+ expect(tweet.length).to be 34
52
+ end
53
+ end
54
+ context 'When has unicode characters' do
55
+ it 'returns the length' do
56
+ tweet = Bluebird::Tweet.new('İşçğdööüqizpqiıı')
57
+ expect(tweet.length).to be 16
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#extract_partials' do
63
+ it 'breaks tweet into partials' do
64
+ tweet = Bluebird::Tweet.new('Lorem ipsum')
65
+ expect(tweet.partials.length).to eq 1
66
+
67
+ partial = tweet.partials[0]
68
+ expect(partial.content).to eq 'Lorem ipsum'
69
+ expect(partial.text?).to be_true
70
+ end
71
+ it 'breaks tweet into partials' do
72
+ tweet = Bluebird::Tweet.new('Lorem #ipsum')
73
+ expect(tweet.partials.length).to eq 2
74
+
75
+ partial = tweet.partials[0]
76
+ expect(partial.content).to eq 'Lorem '
77
+ expect(partial.text?).to be_true
78
+
79
+ partial = tweet.partials[1]
80
+ expect(partial.content).to eq '#ipsum'
81
+ expect(partial.hashtag?).to be_true
82
+ end
83
+ it 'breaks tweet into partials' do
84
+ tweet = Bluebird::Tweet.new('#Lorem #ipsum')
85
+ expect(tweet.partials.length).to eq 3
86
+
87
+ partial = tweet.partials[0]
88
+ expect(partial.content).to eq '#Lorem'
89
+ expect(partial.hashtag?).to be_true
90
+
91
+ partial = tweet.partials[1]
92
+ expect(partial.content).to eq ' '
93
+ expect(partial.text?).to be_true
94
+
95
+ partial = tweet.partials[2]
96
+ expect(partial.content).to eq '#ipsum'
97
+ expect(partial.hashtag?).to be_true
98
+ end
99
+ it 'breaks tweet into partials' do
100
+ tweet = Bluebird::Tweet.new('#Lorem ipsum @dolor')
101
+ expect(tweet.partials.length).to eq 3
102
+
103
+ partial = tweet.partials[0]
104
+ expect(partial.content).to eq '#Lorem'
105
+ expect(partial.hashtag?).to be_true
106
+
107
+ partial = tweet.partials[1]
108
+ expect(partial.content).to eq ' ipsum '
109
+ expect(partial.text?).to be_true
110
+
111
+ partial = tweet.partials[2]
112
+ expect(partial.content).to eq '@dolor'
113
+ expect(partial.mention?).to be_true
114
+ end
115
+ it 'breaks tweet into partials' do
116
+ tweet = Bluebird::Tweet.new(' #Lorem ipsum @dolor ')
117
+ expect(tweet.partials.length).to eq 5
118
+
119
+ partial = tweet.partials[0]
120
+ expect(partial.content).to eq ' '
121
+ expect(partial.text?).to be_true
122
+
123
+ partial = tweet.partials[1]
124
+ expect(partial.content).to eq '#Lorem'
125
+ expect(partial.hashtag?).to be_true
126
+
127
+ partial = tweet.partials[2]
128
+ expect(partial.content).to eq ' ipsum '
129
+ expect(partial.text?).to be_true
130
+
131
+ partial = tweet.partials[3]
132
+ expect(partial.content).to eq '@dolor'
133
+ expect(partial.mention?).to be_true
134
+
135
+ partial = tweet.partials[4]
136
+ expect(partial.content).to eq ' '
137
+ expect(partial.text?).to be_true
138
+ end
139
+ it 'breaks tweet into partials' do
140
+ tweet = Bluebird::Tweet.new('http://example.com example.com.')
141
+ expect(tweet.partials.length).to eq 4
142
+
143
+ partial = tweet.partials[0]
144
+ expect(partial.content).to eq 'http://example.com'
145
+ expect(partial.url?).to be_true
146
+
147
+ partial = tweet.partials[1]
148
+ expect(partial.content).to eq ' '
149
+ expect(partial.text?).to be_true
150
+
151
+ partial = tweet.partials[2]
152
+ expect(partial.content).to eq 'example.com'
153
+ expect(partial.url?).to be_true
154
+
155
+ partial = tweet.partials[3]
156
+ expect(partial.content).to eq '.'
157
+ expect(partial.text?).to be_true
158
+ end
159
+
160
+ it 'breaks tweet into partials' do
161
+ tweet = Bluebird::Tweet.new('#abc.#def')
162
+ expect(tweet.partials.length).to eq 3
163
+
164
+ partial = tweet.partials[0]
165
+ expect(partial.content).to eq '#abc'
166
+ expect(partial.hashtag?).to be_true
167
+
168
+ partial = tweet.partials[1]
169
+ expect(partial.content).to eq '.'
170
+ expect(partial.text?).to be_true
171
+
172
+ partial = tweet.partials[2]
173
+ expect(partial.content).to eq '#def'
174
+ expect(partial.hashtag?).to be_true
175
+ end
176
+ it 'breaks tweet into partials' do
177
+ tweet = Bluebird::Tweet.new('Lorem ipsum @abc/def')
178
+ expect(tweet.partials.length).to eq 2
179
+
180
+ partial = tweet.partials[0]
181
+ expect(partial.content).to eq 'Lorem ipsum '
182
+ expect(partial.text?).to be_true
183
+
184
+ partial = tweet.partials[1]
185
+ expect(partial.content).to eq '@abc/def'
186
+ expect(partial.list?).to be_true
187
+ end
188
+ it 'breaks tweet into partials' do
189
+ tweet = Bluebird::Tweet.new('Lorem #ipsum @dolor')
190
+ expect(tweet.partials.length).to eq 4
191
+
192
+ partial = tweet.partials[0]
193
+ expect(partial.content).to eq 'Lorem '
194
+ expect(partial.text?).to be_true
195
+
196
+ partial = tweet.partials[1]
197
+ expect(partial.content).to eq '#ipsum'
198
+ expect(partial.hashtag?).to be_true
199
+
200
+ partial = tweet.partials[2]
201
+ expect(partial.content).to eq ' '
202
+ expect(partial.text?).to be_true
203
+
204
+ partial = tweet.partials[3]
205
+ expect(partial.content).to eq '@dolor'
206
+ expect(partial.mention?).to be_true
207
+ end
208
+ end
209
+ end