170 lines
4.9 KiB
Ruby
170 lines
4.9 KiB
Ruby
|
require_relative '../../lib/importer/georeferencer'
|
||
|
require_relative '../factories/pg_connection'
|
||
|
require_relative '../../../../services/importer/spec/doubles/log'
|
||
|
require_relative '../../../../spec/rspec_configuration'
|
||
|
require_relative '../../../../spec/spec_helper'
|
||
|
|
||
|
include CartoDB
|
||
|
|
||
|
include CartoDB::Importer2
|
||
|
|
||
|
describe Importer2::Georeferencer do
|
||
|
|
||
|
before(:all) do
|
||
|
@db = Importer2::Factories::PGConnection.new(
|
||
|
:create_db => 'georeferencer_spec'
|
||
|
).connection
|
||
|
|
||
|
create_schema(@db, 'cdb_importer')
|
||
|
|
||
|
@db.execute('SET search_path TO cdb_importer,public')
|
||
|
|
||
|
@table_name = create_table(@db)
|
||
|
|
||
|
@user = create_user
|
||
|
@user.save
|
||
|
end
|
||
|
|
||
|
after(:all) do
|
||
|
puts "Dropping table..."
|
||
|
@db.drop_table? @table_name
|
||
|
|
||
|
#TODO Drop schema
|
||
|
|
||
|
@db.disconnect
|
||
|
|
||
|
@user.destroy
|
||
|
end
|
||
|
|
||
|
before(:each) do
|
||
|
CartoDB::Stats::Aggregator.stubs(:read_config).returns({})
|
||
|
end
|
||
|
|
||
|
describe '#initialize' do
|
||
|
it 'requires a db connection and a table name' do
|
||
|
expect {
|
||
|
Importer2::Georeferencer.new
|
||
|
}.to raise_error(ArgumentError)
|
||
|
|
||
|
expect {
|
||
|
Importer2::Georeferencer.new(Object.new)
|
||
|
}.to raise_error(ArgumentError)
|
||
|
|
||
|
georeferencer_instance(Object.new, 'bogus')
|
||
|
end
|
||
|
end #initialize
|
||
|
|
||
|
describe '#run' do
|
||
|
it 'returns self if no lat / lon columns in the table' do
|
||
|
table_name = create_table(@db,
|
||
|
latitude_column: 'bogus_1',
|
||
|
longitude_column: 'bogus_2'
|
||
|
)
|
||
|
dataset = @db[table_name.to_sym]
|
||
|
|
||
|
dataset.insert(
|
||
|
:name => 'bogus',
|
||
|
:description => 'bogus',
|
||
|
:bogus_1 => rand(90),
|
||
|
:bogus_2 => rand(180)
|
||
|
)
|
||
|
|
||
|
georeferencer = georeferencer_instance
|
||
|
georeferencer.run.should eq georeferencer
|
||
|
|
||
|
dataset.to_a.first.keys.include?(:the_geom).should eq false
|
||
|
end
|
||
|
end #run
|
||
|
|
||
|
describe '#create_the_geom_in' do
|
||
|
before do
|
||
|
@table_name = create_table(@db)
|
||
|
end
|
||
|
|
||
|
it 'adds a the_geom column to a table' do
|
||
|
georeferencer = georeferencer_instance
|
||
|
|
||
|
georeferencer.column_exists_in?(@table_name, 'the_geom').should eq false
|
||
|
georeferencer.create_the_geom_in(@table_name)
|
||
|
georeferencer.column_exists_in?(@table_name, 'the_geom').should eq true
|
||
|
end
|
||
|
|
||
|
it 'returns false if the_geom column already exists' do
|
||
|
georeferencer = georeferencer_instance
|
||
|
|
||
|
georeferencer.column_exists_in?(@table_name, 'the_geom').should eq false
|
||
|
georeferencer.create_the_geom_in(@table_name)
|
||
|
georeferencer.create_the_geom_in(@table_name).should eq false
|
||
|
end
|
||
|
end #create_the_geom_in
|
||
|
|
||
|
describe '#column_exists_in?' do
|
||
|
it 'return true if the column exists in the table' do
|
||
|
georeferencer = georeferencer_instance
|
||
|
georeferencer.column_exists_in?(@table_name, 'non_existent')
|
||
|
.should eq false
|
||
|
georeferencer.column_exists_in?(@table_name, 'name')
|
||
|
.should eq true
|
||
|
end
|
||
|
end #column_exists_in?
|
||
|
|
||
|
describe '#columns_in' do
|
||
|
it 'returns the names of columns in a table' do
|
||
|
georeferencer = georeferencer_instance
|
||
|
georeferencer.columns_in(@table_name).should include :name
|
||
|
georeferencer.columns_in(@table_name).should include :description
|
||
|
georeferencer.columns_in(@table_name).should include :lat
|
||
|
georeferencer.columns_in(@table_name).should include :lon
|
||
|
end
|
||
|
end #columns_in
|
||
|
|
||
|
describe '#find_column_in' do
|
||
|
it 'returns the name of a column in a set of possible names if one of them
|
||
|
actually exists in the table' do
|
||
|
georeferencer = georeferencer_instance
|
||
|
georeferencer.find_column_in(@table_name, "'name','bogus'")
|
||
|
.should eq 'name'
|
||
|
|
||
|
georeferencer.find_column_in(@table_name, "'bogus'").should eq false
|
||
|
end
|
||
|
end #find_column_in
|
||
|
|
||
|
def georeferencer_instance(db = @db, table_name = @table_name)
|
||
|
options = { guessing: {enabled: false} }
|
||
|
Importer2::Georeferencer.new(@db, table_name, options, Importer2::Georeferencer::DEFAULT_SCHEMA, job=nil, geometry_columns=nil, logger=CartoDB::Importer2::Doubles::Log.new(@user))
|
||
|
end
|
||
|
|
||
|
# Attempts to create a new database schema
|
||
|
# Does not raise exception if the schema already exists
|
||
|
def create_schema(db, schema)
|
||
|
db.run(%Q{CREATE SCHEMA IF NOT EXISTS #{schema}})
|
||
|
end #create_schema
|
||
|
|
||
|
def create_table(db, options={})
|
||
|
table_name = options.fetch(:table_name, "importer_#{rand(999)}")
|
||
|
latitude_column = options.fetch(:latitude_column, :lat)
|
||
|
longitude_column = options.fetch(:longitude_column, :lon)
|
||
|
|
||
|
db.drop_table?(table_name)
|
||
|
db.create_table?(table_name) do
|
||
|
String :name
|
||
|
String :description
|
||
|
String latitude_column.to_sym
|
||
|
String longitude_column.to_sym
|
||
|
String :ogc_fid
|
||
|
end
|
||
|
|
||
|
table_name
|
||
|
end
|
||
|
|
||
|
def random_record
|
||
|
{
|
||
|
name: 'bogus',
|
||
|
description: 'bogus',
|
||
|
lat: rand(90),
|
||
|
lon: rand(180),
|
||
|
ogc_fid: rand(100)
|
||
|
}
|
||
|
end #random_record
|
||
|
end # Importer2::Georeferencer
|