discourse/spec/models/topic_link_click_spec.rb
Dan Johnson 2e478d8537 TopicLinkClick: convert 'ip' (bigint) -> 'ip_address' (inet)
When accessed over IPv6, the ip address of the user is a 128-bit number,
too big for PostgreSQL's bigint data type. Since PostgresSQL has the
built-in inet type, which handles both IPv4 and IPv6 addresses, we
should use that instead. Where this is done elsewhere in the codebase,
the column is called ip_address, so we should follow that convention as
well.

This migration uses a SQL command to populate the new field from the old
one, so as not to rely on the TopicLinkClick model class, which should
keep the migration from failing if that class is modified in the future.
2013-06-25 19:41:19 -04:00

106 lines
2.6 KiB
Ruby

require 'discourse'
require 'spec_helper'
describe TopicLinkClick do
it { should belong_to :topic_link }
it { should belong_to :user }
it { should validate_presence_of :topic_link_id }
def test_uri
URI.parse('http://test.host')
end
context 'topic_links' do
before do
@topic = Fabricate(:topic)
@post = Fabricate(:post_with_external_links, user: @topic.user, topic: @topic)
TopicLink.extract_from(@post)
@topic_link = @topic.topic_links.first
end
it 'has 0 clicks at first' do
@topic_link.clicks.should == 0
end
context 'create' do
before do
TopicLinkClick.create(topic_link: @topic_link, ip_address: '192.168.1.1')
end
it 'creates the forum topic link click' do
TopicLinkClick.count.should == 1
end
it 'has 0 clicks at first' do
@topic_link.reload
@topic_link.clicks.should == 1
end
it 'serializes and deserializes the IP' do
TopicLinkClick.first.ip_address.to_s.should == '192.168.1.1'
end
end
context 'create_from' do
context 'without a url' do
it "doesn't raise an exception" do
TopicLinkClick.create_from(url: "url that doesn't exist", post_id: @post.id, ip: '127.0.0.1')
end
end
context 'clicking on your own link' do
it "should not record the click" do
lambda {
TopicLinkClick.create_from(url: @topic_link.url, post_id: @post.id, ip: '127.0.0.1', user_id: @post.user_id)
}.should_not change(TopicLinkClick, :count)
end
end
context 'with a valid url and post_id' do
before do
TopicLinkClick.create_from(url: @topic_link.url, post_id: @post.id, ip: '127.0.0.1')
@click = TopicLinkClick.last
end
it 'creates a click' do
@click.should be_present
end
it 'has the topic_link id' do
@click.topic_link.should == @topic_link
end
context "clicking again" do
it "should not record the click due to rate limiting" do
-> { TopicLinkClick.create_from(url: @topic_link.url, post_id: @post.id, ip: '127.0.0.1') }.should_not change(TopicLinkClick, :count)
end
end
end
context 'with a valid url and topic_id' do
before do
TopicLinkClick.create_from(url: @topic_link.url, topic_id: @topic.id, ip: '127.0.0.1')
@click = TopicLinkClick.last
end
it 'creates a click' do
@click.should be_present
end
it 'has the topic_link id' do
@click.topic_link.should == @topic_link
end
end
end
end
end