require "spec_helper"

describe Story do
  it "should get a short id" do
    s = Story.make!(:title => "hello", :url => "http://example.com/")

    s.short_id.should match(/^\A[a-zA-Z0-9]{1,10}\z/)
  end

  it "requires a url or a description" do
    expect { Story.make!(:title => "hello", :url => "",
      :description => "") }.to raise_error

    expect { Story.make!(:title => "hello", :description => "hi", :url => nil)
      }.to_not raise_error

    expect { Story.make!(:title => "hello", :url => "http://ex.com/",
      :description => nil) }.to_not raise_error
  end

  it "does not allow too-short titles" do
    expect { Story.make!(:title => "") }.to raise_error
    expect { Story.make!(:title => "hi") }.to raise_error
    expect { Story.make!(:title => "hello") }.to_not raise_error
  end

  it "does not allow too-long titles" do
    expect { Story.make!(:title => ("hello" * 100)) }.to raise_error
  end

  it "must have at least one tag" do
    expect { Story.make!(:tags_a => nil) }.to raise_error
    expect { Story.make!(:tags_a => [ "", " " ]) }.to raise_error

    expect { Story.make!(:tags_a => [ "", "tag1" ]) }.to_not raise_error
  end

  it "checks for invalid urls" do
    expect { Story.make!(:title => "test", :url => "http://gooses.com/")
      }.to_not raise_error

    expect { Story.make!(:title => "test", url => "ftp://gooses/")
      }.to raise_error
  end

  it "checks for a previously posted story with same url" do
    Story.count.should == 0

    Story.make!(:title => "flim flam", :url => "http://example.com/")
    Story.count.should == 1

    expect { Story.make!(:title => "flim flam 2",
      :url => "http://example.com/") }.to raise_error

    Story.count.should == 1

    expect { Story.make!(:title => "flim flam 2",
      :url => "http://www.example.com/") }.to raise_error

    Story.count.should == 1
  end

  it "parses domain properly" do
    s = Story.make!(:url => "http://example.com")
    s.domain.should == "example.com"

    s = Story.make!(:url => "http://www3.example.com/goose")
    s.domain.should == "example.com"

    s = Story.make!(:url => "http://flub.example.com")
    s.domain.should == "flub.example.com"
  end

  it "converts a title to a url properly" do
    s = Story.make!(:title => "Hello there, this is a title")
    s.title_as_url.should == "hello_there_this_is_a_title"

    s = Story.make!(:title => "Hello _ underscore")
    s.title_as_url.should == "hello_underscore"
  end

  it "is not editable by another non-admin user" do
    u = User.make!

    s = Story.make!(:user_id => u.id)
    s.is_editable_by_user?(u).should == true

    u = User.make!
    s.is_editable_by_user?(u).should == false
  end

  it "can fetch its title properly" do
    s = Story.make
    s.fetched_content = File.read(Rails.root +
      "spec/fixtures/story_pages/1.html")
    s.fetched_title.should == "B2G demo & quick hack // by Paul Rouget"

    s = Story.make
    s.fetched_content = File.read(Rails.root +
      "spec/fixtures/story_pages/2.html")
    s.fetched_title.should == "Google"
  end

  it "has an underscored url from its title" do
    s = Story.make(:title => "The One-second War (What Time Will You Die?) ")
    s.title_as_url.should == "the_one-second_war_what_time_will_you_die"
  end

  it "sets the url properly" do
    s = Story.make(:title => "blah")
    s.url = "https://factorable.net/"
    s.valid?
    s.url.should == "https://factorable.net/"
  end

  it "calculates tag changes properly" do
    s = Story.make!(:title => "blah", :tags_a => [ "tag1", "tag2" ])

    s.tags_a = [ "tag2" ]
    s.tagging_changes.should == { "tags" => [ "tag1 tag2", "tag2" ] }
  end

  it "logs moderations properly" do
    mod = User.make!(:username => "mod", :is_moderator => true)

    s = Story.make!(:title => "blah", :tags_a => [ "tag1", "tag2" ],
      :description => "desc")

    s.title = "changed title"
    s.description = nil
    s.tags_a = [ "tag1" ]

    s.editor = mod
    s.moderation_reason = "because i hate you"
    s.save!

    mod_log = Moderation.last
    mod_log.moderator_user_id.should == mod.id
    mod_log.story_id.should == s.id
    mod_log.reason.should == "because i hate you"
    mod_log.action.should match(/title from "blah" to "changed title"/)
    mod_log.action.should match(/tags from "tag1 tag2" to "tag1"/)
  end
end
