From b5854d3172cca480e2675285e69c840300c0c781 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonne=20Ha=C3=9F?= <me@mrzyx.de>
Date: Mon, 6 Jan 2014 19:43:00 +0100
Subject: [PATCH] remove outer (deprecated) describe blocks from shared
 examples

---
 spec/shared_behaviors/account_deletion.rb |  65 +++--
 spec/shared_behaviors/relayable.rb        | 190 ++++++++-------
 spec/shared_behaviors/stream.rb           |  78 +++---
 spec/shared_behaviors/taggable.rb         | 279 +++++++++++-----------
 4 files changed, 301 insertions(+), 311 deletions(-)

diff --git a/spec/shared_behaviors/account_deletion.rb b/spec/shared_behaviors/account_deletion.rb
index d685432e61..50ecf251e7 100644
--- a/spec/shared_behaviors/account_deletion.rb
+++ b/spec/shared_behaviors/account_deletion.rb
@@ -4,39 +4,36 @@
 
 require 'spec_helper'
 
-describe 'deleteing your account' do
-  shared_examples_for 'it removes the person associations' do
-    it "removes all of the person's posts" do
-      Post.where(:author_id => @person.id).count.should == 0 
-    end
-
-    it 'deletes all person contacts' do
-      Contact.where(:person_id => @person.id).should be_empty
-    end
-
-    it 'deletes all mentions' do
-      @person.mentions.should be_empty
-    end
-
-    it "removes all of the person's photos" do
-      Photo.where(:author_id => @person.id).should be_empty
-    end
-
-    it 'sets the person object as closed and the profile is cleared' do
-      @person.reload.closed_account.should  be_true
-
-      @person.profile.reload.first_name.should  be_blank
-      @person.profile.reload.last_name.should  be_blank
-    end
-
-    it 'deletes only the converersation visibility for the deleted user' do
-      ConversationVisibility.where(:person_id => alice.person.id).should_not be_empty
-      ConversationVisibility.where(:person_id => @person.id).should be_empty
-    end
-
-    it "deletes the share visibilities on the person's posts" do
-      ShareVisibility.for_contacts_of_a_person(@person).should be_empty
-    end
+shared_examples_for 'it removes the person associations' do
+  it "removes all of the person's posts" do
+    Post.where(:author_id => @person.id).count.should == 0
+  end
+
+  it 'deletes all person contacts' do
+    Contact.where(:person_id => @person.id).should be_empty
+  end
+
+  it 'deletes all mentions' do
+    @person.mentions.should be_empty
+  end
+
+  it "removes all of the person's photos" do
+    Photo.where(:author_id => @person.id).should be_empty
   end
-end
 
+  it 'sets the person object as closed and the profile is cleared' do
+    @person.reload.closed_account.should  be_true
+
+    @person.profile.reload.first_name.should  be_blank
+    @person.profile.reload.last_name.should  be_blank
+  end
+
+  it 'deletes only the converersation visibility for the deleted user' do
+    ConversationVisibility.where(:person_id => alice.person.id).should_not be_empty
+    ConversationVisibility.where(:person_id => @person.id).should be_empty
+  end
+
+  it "deletes the share visibilities on the person's posts" do
+    ShareVisibility.for_contacts_of_a_person(@person).should be_empty
+  end
+end
diff --git a/spec/shared_behaviors/relayable.rb b/spec/shared_behaviors/relayable.rb
index ed753e0031..1b3dc9766b 100644
--- a/spec/shared_behaviors/relayable.rb
+++ b/spec/shared_behaviors/relayable.rb
@@ -4,127 +4,125 @@
 
 require 'spec_helper'
 
-describe Diaspora::Relayable do
-  shared_examples_for "it is relayable" do
-
-    describe 'interacted_at' do
-      it 'sets the interacted at of the parent to the created at of the relayable post' do
-        Timecop.freeze Time.now do
-          relayable = build_object
-          relayable.save
-          if relayable.parent.respond_to?(:interacted_at) #I'm sorry.
-            relayable.parent.interacted_at.to_i.should == relayable.created_at.to_i
-          end
+shared_examples_for "it is relayable" do
+
+  describe 'interacted_at' do
+    it 'sets the interacted at of the parent to the created at of the relayable post' do
+      Timecop.freeze Time.now do
+        relayable = build_object
+        relayable.save
+        if relayable.parent.respond_to?(:interacted_at) #I'm sorry.
+          relayable.parent.interacted_at.to_i.should == relayable.created_at.to_i
         end
       end
     end
+  end
 
-    describe 'validations' do
-      describe 'on :author_id' do
-        context "the author is on the parent object author's ignore list when object is created" do
-          before do
-            bob.blocks.create(:person => alice.person)
-            @relayable = build_object
-          end
-
-          it "is invalid" do
-            @relayable.should_not be_valid
-            @relayable.should have(1).error_on(:author_id)
-          end
-
-          it "sends a retraction for the object" do
-            pending 'need to figure out how to test this'
-            RelayableRetraction.should_receive(:build)
-            Postzord::Dispatcher.should_receive(:build)
-            @relayable.valid?
-          end
-
-          it "works if the object has no parent" do # This can happen if we get a comment for a post that's been deleted
-            @relayable.parent = nil
-            expect { @relayable.valid? }.to_not raise_exception
-          end
+  describe 'validations' do
+    describe 'on :author_id' do
+      context "the author is on the parent object author's ignore list when object is created" do
+        before do
+          bob.blocks.create(:person => alice.person)
+          @relayable = build_object
         end
 
-        context "the author is added to the parent object author's ignore list later" do
-          it "is valid" do
-            relayable = build_object
-            relayable.save!
-            bob.blocks.create(:person => alice.person)
-            relayable.should be_valid
-          end
+        it "is invalid" do
+          @relayable.should_not be_valid
+          @relayable.should have(1).error_on(:author_id)
         end
-      end
-    end
 
-    context 'encryption' do
-      describe '#parent_author_signature' do
-        it 'should sign the object if the user is the post author' do
-          @object_by_parent_author.verify_parent_author_signature.should be_true
+        it "sends a retraction for the object" do
+          pending 'need to figure out how to test this'
+          RelayableRetraction.should_receive(:build)
+          Postzord::Dispatcher.should_receive(:build)
+          @relayable.valid?
         end
 
-        it 'does not sign as the parent author is not parent' do
-          @object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
-          @object_by_recipient.verify_parent_author_signature.should be_false
+        it "works if the object has no parent" do # This can happen if we get a comment for a post that's been deleted
+          @relayable.parent = nil
+          expect { @relayable.valid? }.to_not raise_exception
         end
+      end
 
-        it 'should verify a object made on a remote post by a different contact' do
-          @object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
-          @object_by_recipient.parent_author_signature = @object_by_recipient.send(:sign_with_key, @local_luke.encryption_key)
-          @object_by_recipient.verify_parent_author_signature.should be_true
+      context "the author is added to the parent object author's ignore list later" do
+        it "is valid" do
+          relayable = build_object
+          relayable.save!
+          bob.blocks.create(:person => alice.person)
+          relayable.should be_valid
         end
       end
+    end
+  end
+
+  context 'encryption' do
+    describe '#parent_author_signature' do
+      it 'should sign the object if the user is the post author' do
+        @object_by_parent_author.verify_parent_author_signature.should be_true
+      end
 
-      describe '#author_signature' do
-        it 'should sign as the object author' do
-          @object_on_remote_parent.signature_valid?.should be_true
-          @object_by_parent_author.signature_valid?.should be_true
-          @object_by_recipient.signature_valid?.should be_true
-        end
+      it 'does not sign as the parent author is not parent' do
+        @object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
+        @object_by_recipient.verify_parent_author_signature.should be_false
+      end
+
+      it 'should verify a object made on a remote post by a different contact' do
+        @object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
+        @object_by_recipient.parent_author_signature = @object_by_recipient.send(:sign_with_key, @local_luke.encryption_key)
+        @object_by_recipient.verify_parent_author_signature.should be_true
       end
     end
 
-    context 'propagation' do
-      describe '#receive' do
-        it 'does not overwrite a object that is already in the db' do
-          expect {
-            @dup_object_by_parent_author.receive(@local_leia, @local_luke.person)
-          }.to_not change { @dup_object_by_parent_author.class.count }
-        end
+    describe '#author_signature' do
+      it 'should sign as the object author' do
+        @object_on_remote_parent.signature_valid?.should be_true
+        @object_by_parent_author.signature_valid?.should be_true
+        @object_by_recipient.signature_valid?.should be_true
+      end
+    end
+  end
 
-        it 'does not process if post_creator_signature is invalid' do
-          @object_by_parent_author.delete # remove object from db so we set a creator sig
-          @dup_object_by_parent_author.parent_author_signature = "dsfadsfdsa"
-          @dup_object_by_parent_author.receive(@local_leia, @local_luke.person).should == nil
-        end
+  context 'propagation' do
+    describe '#receive' do
+      it 'does not overwrite a object that is already in the db' do
+        expect {
+          @dup_object_by_parent_author.receive(@local_leia, @local_luke.person)
+        }.to_not change { @dup_object_by_parent_author.class.count }
+      end
 
-        it 'signs when the person receiving is the parent author' do
-          @object_by_recipient.save
-          @object_by_recipient.receive(@local_luke, @local_leia.person)
-          @object_by_recipient.reload.parent_author_signature.should_not be_blank
-        end
+      it 'does not process if post_creator_signature is invalid' do
+        @object_by_parent_author.delete # remove object from db so we set a creator sig
+        @dup_object_by_parent_author.parent_author_signature = "dsfadsfdsa"
+        @dup_object_by_parent_author.receive(@local_leia, @local_luke.person).should == nil
+      end
 
-        it 'dispatches when the person receiving is the parent author' do
-          p = Postzord::Dispatcher.build(@local_luke, @object_by_recipient)
-          p.should_receive(:post)
-          p.class.stub(:new).and_return(p)
-          @object_by_recipient.receive(@local_luke, @local_leia.person)
-        end
+      it 'signs when the person receiving is the parent author' do
+        @object_by_recipient.save
+        @object_by_recipient.receive(@local_luke, @local_leia.person)
+        @object_by_recipient.reload.parent_author_signature.should_not be_blank
+      end
 
-        it 'calls after_receive callback' do
-          @object_by_recipient.should_receive(:after_receive)
-          @object_by_recipient.class.stub(:where).and_return([@object_by_recipient])
-          @object_by_recipient.receive(@local_luke, @local_leia.person)
-        end
+      it 'dispatches when the person receiving is the parent author' do
+        p = Postzord::Dispatcher.build(@local_luke, @object_by_recipient)
+        p.should_receive(:post)
+        p.class.stub(:new).and_return(p)
+        @object_by_recipient.receive(@local_luke, @local_leia.person)
       end
 
-      describe '#subscribers' do
-        it 'returns the posts original audience, if the post is owned by the user' do
-          @object_by_parent_author.subscribers(@local_luke).map(&:id).should =~ [@local_leia.person, @remote_raphael].map(&:id)
-        end
+      it 'calls after_receive callback' do
+        @object_by_recipient.should_receive(:after_receive)
+        @object_by_recipient.class.stub(:where).and_return([@object_by_recipient])
+        @object_by_recipient.receive(@local_luke, @local_leia.person)
+      end
+    end
 
-        it 'returns the owner of the original post, if the user owns the object' do
-          @object_by_recipient.subscribers(@local_leia).map(&:id).should =~ [@local_luke.person].map(&:id)
-        end
+    describe '#subscribers' do
+      it 'returns the posts original audience, if the post is owned by the user' do
+        @object_by_parent_author.subscribers(@local_luke).map(&:id).should =~ [@local_leia.person, @remote_raphael].map(&:id)
+      end
+
+      it 'returns the owner of the original post, if the user owns the object' do
+        @object_by_recipient.subscribers(@local_leia).map(&:id).should =~ [@local_luke.person].map(&:id)
       end
     end
   end
diff --git a/spec/shared_behaviors/stream.rb b/spec/shared_behaviors/stream.rb
index 9ff20b3957..9207be34e2 100644
--- a/spec/shared_behaviors/stream.rb
+++ b/spec/shared_behaviors/stream.rb
@@ -1,45 +1,43 @@
 require 'spec_helper'
 
-describe 'Streams' do
-  shared_examples_for 'it is a stream' do
-    context 'required methods for display' do
-      it '#title' do
-        @stream.title.should_not be_nil
-      end
-
-      it '#posts' do
-        @stream.posts.should_not be_nil
-      end
-
-      it '#people' do
-        @stream.people.should_not be_nil
-      end
-
-      it '#publisher_opts' do
-        @stream.send(:publisher_opts).should_not be_nil
-      end
-
-      it 'has a #contacts title' do
-        @stream.contacts_title.should_not be_nil
-      end
-
-      it 'has a contacts link' do
-        @stream.contacts_link.should_not be_nil
-      end
-
-      it 'should make the stream a time object' do
-        @stream.max_time = 123
-        @stream.max_time.should be_a(Time)
-      end
-
-      it 'should always have an order (default created_at)' do
-        @stream.order=nil
-        @stream.order.should_not be_nil
-      end
-
-      it 'initializes a publisher' do
-        @stream.publisher.should be_a(Publisher)
-      end
+shared_examples_for 'it is a stream' do
+  context 'required methods for display' do
+    it '#title' do
+      @stream.title.should_not be_nil
+    end
+
+    it '#posts' do
+      @stream.posts.should_not be_nil
+    end
+
+    it '#people' do
+      @stream.people.should_not be_nil
+    end
+
+    it '#publisher_opts' do
+      @stream.send(:publisher_opts).should_not be_nil
+    end
+
+    it 'has a #contacts title' do
+      @stream.contacts_title.should_not be_nil
+    end
+
+    it 'has a contacts link' do
+      @stream.contacts_link.should_not be_nil
+    end
+
+    it 'should make the stream a time object' do
+      @stream.max_time = 123
+      @stream.max_time.should be_a(Time)
+    end
+
+    it 'should always have an order (default created_at)' do
+      @stream.order=nil
+      @stream.order.should_not be_nil
+    end
+
+    it 'initializes a publisher' do
+      @stream.publisher.should be_a(Publisher)
     end
   end
 end
diff --git a/spec/shared_behaviors/taggable.rb b/spec/shared_behaviors/taggable.rb
index 1d7efcbc5c..339556bf2b 100644
--- a/spec/shared_behaviors/taggable.rb
+++ b/spec/shared_behaviors/taggable.rb
@@ -5,165 +5,162 @@
 
 require 'spec_helper'
 
-describe Diaspora::Taggable do
-  shared_examples_for "it is taggable" do
-    include ActionView::Helpers::UrlHelper
+shared_examples_for "it is taggable" do
+  include ActionView::Helpers::UrlHelper
 
-    def tag_link(s)
-      link_to  "##{s}", "/tags/#{s}", :class => 'tag'
-    end
+  def tag_link(s)
+    link_to  "##{s}", "/tags/#{s}", :class => 'tag'
+  end
 
-    describe '.format_tags' do
-      before do
-        @str = '#what #hey #vöglein'
-        @object.send(@object.class.field_with_tags_setter, @str)
-        @object.build_tags
-        @object.save!
-      end
+  describe '.format_tags' do
+    before do
+      @str = '#what #hey #vöglein'
+      @object.send(@object.class.field_with_tags_setter, @str)
+      @object.build_tags
+      @object.save!
+    end
 
-      it "supports non-ascii characters" do
-        @object.tags(true).map(&:name).should include('vöglein')
-      end
+    it "supports non-ascii characters" do
+      @object.tags(true).map(&:name).should include('vöglein')
+    end
 
-      it 'links each tag' do
-        formatted_string = Diaspora::Taggable.format_tags(@str)
-        formatted_string.should include(tag_link('what'))
-        formatted_string.should include(tag_link('hey'))
-        formatted_string.should include(tag_link('vöglein'))
-      end
+    it 'links each tag' do
+      formatted_string = Diaspora::Taggable.format_tags(@str)
+      formatted_string.should include(tag_link('what'))
+      formatted_string.should include(tag_link('hey'))
+      formatted_string.should include(tag_link('vöglein'))
+    end
 
-      it 'responds to plain_text' do
-        Diaspora::Taggable.format_tags(@str, :plain_text => true).should == @str
-      end
+    it 'responds to plain_text' do
+      Diaspora::Taggable.format_tags(@str, :plain_text => true).should == @str
+    end
 
-      it "doesn't mangle text when tags are involved" do
-        expected = {
-          nil => '',
-          '' => '',
-          'abc' => 'abc',
-          'a #b c' => "a #{tag_link('b')} c",
-          '#'                      => '#',
-          '##'                     => '##',
-          '###'                    => '###',
-          '#a'                     => tag_link('a'),
-          '#foobar'                => tag_link('foobar'),
-          '#foocar<br>'            => "#{tag_link('foocar')}&lt;br&gt;",
-          '#fooo@oo'               => "#{tag_link('fooo')}@oo",
-          '#num3ric hash tags'     => "#{tag_link('num3ric')} hash tags",
-          '#12345 tag'             => "#{tag_link('12345')} tag",
-          '#12cde tag'             => "#{tag_link('12cde')} tag",
-          '#abc45 tag'             => "#{tag_link('abc45')} tag",
-          '#<3'                    => %{<a href="/tags/<3" class="tag">#&lt;3</a>},
-          'i #<3'                  => %{i <a href="/tags/<3" class="tag">#&lt;3</a>},
-          'i #<3 you'              => %{i <a href="/tags/<3" class="tag">#&lt;3</a> you},
-          '#<4'                    => '#&lt;4',
-          'test#foo test'          => 'test#foo test',
-          'test.#joo bar'          => 'test.#joo bar',
-          'test #foodar test'      => "test #{tag_link('foodar')} test",
-          'test #foofar<br> test'  => "test #{tag_link('foofar')}&lt;br&gt; test",
-          'test #gooo@oo test'     => "test #{tag_link('gooo')}@oo test",
-          'test #foo-test test'    => "test #{tag_link('foo-test')} test",
-          'test #hoo'              => "test #{tag_link('hoo')}",
-          'test #two_word tags'    => "test #{tag_link('two_word')} tags",
-          'test #three_word_tags'  => "test #{tag_link('three_word_tags')}",
-          '#terminal_underscore_'  => tag_link('terminal_underscore_'),
-          '#terminalunderscore_'   => tag_link('terminalunderscore_'),
-          '#_initialunderscore'    => tag_link('_initialunderscore'),
-          '#_initial_underscore'   => tag_link('_initial_underscore'),
-          '#terminalhyphen-'       => tag_link('terminalhyphen-'),
-          '#terminal-hyphen-'      => tag_link('terminal-hyphen-'),
-          '#terminalhyphen- tag'   => "#{tag_link('terminalhyphen-')} tag",
-          '#-initialhyphen'        => tag_link('-initialhyphen'),
-          '#-initialhyphen tag'    => "#{tag_link('-initialhyphen')} tag",
-          '#-initial-hyphen'       => tag_link('-initial-hyphen'),
-        }
-
-        expected.each do |input,output|
-          Diaspora::Taggable.format_tags(input).should == output
-        end
+    it "doesn't mangle text when tags are involved" do
+      expected = {
+        nil => '',
+        '' => '',
+        'abc' => 'abc',
+        'a #b c' => "a #{tag_link('b')} c",
+        '#'                      => '#',
+        '##'                     => '##',
+        '###'                    => '###',
+        '#a'                     => tag_link('a'),
+        '#foobar'                => tag_link('foobar'),
+        '#foocar<br>'            => "#{tag_link('foocar')}&lt;br&gt;",
+        '#fooo@oo'               => "#{tag_link('fooo')}@oo",
+        '#num3ric hash tags'     => "#{tag_link('num3ric')} hash tags",
+        '#12345 tag'             => "#{tag_link('12345')} tag",
+        '#12cde tag'             => "#{tag_link('12cde')} tag",
+        '#abc45 tag'             => "#{tag_link('abc45')} tag",
+        '#<3'                    => %{<a href="/tags/<3" class="tag">#&lt;3</a>},
+        'i #<3'                  => %{i <a href="/tags/<3" class="tag">#&lt;3</a>},
+        'i #<3 you'              => %{i <a href="/tags/<3" class="tag">#&lt;3</a> you},
+        '#<4'                    => '#&lt;4',
+        'test#foo test'          => 'test#foo test',
+        'test.#joo bar'          => 'test.#joo bar',
+        'test #foodar test'      => "test #{tag_link('foodar')} test",
+        'test #foofar<br> test'  => "test #{tag_link('foofar')}&lt;br&gt; test",
+        'test #gooo@oo test'     => "test #{tag_link('gooo')}@oo test",
+        'test #foo-test test'    => "test #{tag_link('foo-test')} test",
+        'test #hoo'              => "test #{tag_link('hoo')}",
+        'test #two_word tags'    => "test #{tag_link('two_word')} tags",
+        'test #three_word_tags'  => "test #{tag_link('three_word_tags')}",
+        '#terminal_underscore_'  => tag_link('terminal_underscore_'),
+        '#terminalunderscore_'   => tag_link('terminalunderscore_'),
+        '#_initialunderscore'    => tag_link('_initialunderscore'),
+        '#_initial_underscore'   => tag_link('_initial_underscore'),
+        '#terminalhyphen-'       => tag_link('terminalhyphen-'),
+        '#terminal-hyphen-'      => tag_link('terminal-hyphen-'),
+        '#terminalhyphen- tag'   => "#{tag_link('terminalhyphen-')} tag",
+        '#-initialhyphen'        => tag_link('-initialhyphen'),
+        '#-initialhyphen tag'    => "#{tag_link('-initialhyphen')} tag",
+        '#-initial-hyphen'       => tag_link('-initial-hyphen'),
+      }
+
+      expected.each do |input,output|
+        Diaspora::Taggable.format_tags(input).should == output
       end
     end
+  end
 
-    describe '#build_tags' do
-      it 'builds the tags' do
-        @object.send(@object.class.field_with_tags_setter, '#what')
-        @object.build_tags
-        @object.tag_list.should == ['what']
-        lambda {
-          @object.save
-        }.should change{@object.tags.count}.by(1)
-      end
+  describe '#build_tags' do
+    it 'builds the tags' do
+      @object.send(@object.class.field_with_tags_setter, '#what')
+      @object.build_tags
+      @object.tag_list.should == ['what']
+      lambda {
+        @object.save
+      }.should change{@object.tags.count}.by(1)
     end
+  end
 
-    describe '#tag_strings' do
-      it 'returns a string for every #thing' do
-        str = '#what #hey #that"smybike. #@hey ##boo # #THATWASMYBIKE #vöglein #hey#there #135440we #abc/23 ### #h!gh #ok? #see: #re:publica'
-        arr = ['what', 'hey', 'that', 'THATWASMYBIKE', 'vöglein', '135440we', 'abc', 'h', 'ok', 'see', 're']
+  describe '#tag_strings' do
+    it 'returns a string for every #thing' do
+      str = '#what #hey #that"smybike. #@hey ##boo # #THATWASMYBIKE #vöglein #hey#there #135440we #abc/23 ### #h!gh #ok? #see: #re:publica'
+      arr = ['what', 'hey', 'that', 'THATWASMYBIKE', 'vöglein', '135440we', 'abc', 'h', 'ok', 'see', 're']
 
-        @object.send(@object.class.field_with_tags_setter, str)
-        @object.tag_strings.should =~ arr
-      end
+      @object.send(@object.class.field_with_tags_setter, str)
+      @object.tag_strings.should =~ arr
+    end
 
-      it 'extracts tags despite surrounding text' do
-        expected = {
-          ''                       => nil,
-          '#'                      => nil,
-          '##'                     => nil,
-          '###'                    => nil,
-          '#a'                     => 'a',
-          '#foobar'                => 'foobar',
-          '#foocar<br>'            => 'foocar',
-          '#fooo@oo'               => 'fooo',
-          '#num3ric hash tags'     => 'num3ric',
-          '#12345 tag'             => '12345',
-          '#12cde tag'             => '12cde',
-          '#abc45 tag'             => 'abc45',
-          '#<3'                    => '<3',
-          '#<4'                    => nil,
-          'test#foo test'          => nil,
-          'test.#joo bar'          => nil,
-          'test #foodar test'      => 'foodar',
-          'test #foofar<br> test'  => 'foofar',
-          'test #gooo@oo test'     => 'gooo',
-          'test #<3 test'          => '<3',
-          'test #foo-test test'    => 'foo-test',
-          'test #hoo'              => 'hoo',
-          'test #two_word tags'    => 'two_word',
-          'test #three_word_tags'  => 'three_word_tags',
-          '#terminal_underscore_'  => 'terminal_underscore_',
-          '#terminalunderscore_'   => 'terminalunderscore_',
-          '#_initialunderscore'    => '_initialunderscore',
-          '#_initial_underscore'   => '_initial_underscore',
-          '#terminalhyphen-'       => 'terminalhyphen-',
-          '#terminal-hyphen-'      => 'terminal-hyphen-',
-          '#terminalhyphen- tag'   => 'terminalhyphen-',
-          '#-initialhyphen'        => '-initialhyphen',
-          '#-initialhyphen tag'    => '-initialhyphen',
-          '#-initial-hyphen'       => '-initial-hyphen',
-        }
-
-        expected.each do |text,hashtag|
-          @object.send  @object.class.field_with_tags_setter, text
-          @object.tag_strings.should == [hashtag].compact
-        end
+    it 'extracts tags despite surrounding text' do
+      expected = {
+        ''                       => nil,
+        '#'                      => nil,
+        '##'                     => nil,
+        '###'                    => nil,
+        '#a'                     => 'a',
+        '#foobar'                => 'foobar',
+        '#foocar<br>'            => 'foocar',
+        '#fooo@oo'               => 'fooo',
+        '#num3ric hash tags'     => 'num3ric',
+        '#12345 tag'             => '12345',
+        '#12cde tag'             => '12cde',
+        '#abc45 tag'             => 'abc45',
+        '#<3'                    => '<3',
+        '#<4'                    => nil,
+        'test#foo test'          => nil,
+        'test.#joo bar'          => nil,
+        'test #foodar test'      => 'foodar',
+        'test #foofar<br> test'  => 'foofar',
+        'test #gooo@oo test'     => 'gooo',
+        'test #<3 test'          => '<3',
+        'test #foo-test test'    => 'foo-test',
+        'test #hoo'              => 'hoo',
+        'test #two_word tags'    => 'two_word',
+        'test #three_word_tags'  => 'three_word_tags',
+        '#terminal_underscore_'  => 'terminal_underscore_',
+        '#terminalunderscore_'   => 'terminalunderscore_',
+        '#_initialunderscore'    => '_initialunderscore',
+        '#_initial_underscore'   => '_initial_underscore',
+        '#terminalhyphen-'       => 'terminalhyphen-',
+        '#terminal-hyphen-'      => 'terminal-hyphen-',
+        '#terminalhyphen- tag'   => 'terminalhyphen-',
+        '#-initialhyphen'        => '-initialhyphen',
+        '#-initialhyphen tag'    => '-initialhyphen',
+        '#-initial-hyphen'       => '-initial-hyphen',
+      }
+
+      expected.each do |text,hashtag|
+        @object.send  @object.class.field_with_tags_setter, text
+        @object.tag_strings.should == [hashtag].compact
       end
+    end
 
-      it 'returns no duplicates' do
-        str = '#what #what #what #whaaaaaaaaaat'
-        arr = ['what','whaaaaaaaaaat']
+    it 'returns no duplicates' do
+      str = '#what #what #what #whaaaaaaaaaat'
+      arr = ['what','whaaaaaaaaaat']
 
-        @object.send(@object.class.field_with_tags_setter, str)
-        @object.tag_strings.should =~ arr
-      end
+      @object.send(@object.class.field_with_tags_setter, str)
+      @object.tag_strings.should =~ arr
+    end
 
-      it 'is case insensitive' do
-        str = '#what #wHaT #WHAT'
-        arr = ['what']
+    it 'is case insensitive' do
+      str = '#what #wHaT #WHAT'
+      arr = ['what']
 
-        @object.send(@object.class.field_with_tags_setter, str)
-        @object.tag_strings.should =~ arr
-      end
+      @object.send(@object.class.field_with_tags_setter, str)
+      @object.tag_strings.should =~ arr
     end
   end
 end
-
-- 
GitLab