ImportToMysql now loads users.csv. Spec currently failing on datetime conversion.

This commit is contained in:
Sarah Mei 2011-01-04 22:43:32 -08:00
parent 80867bbc54
commit 7f86a9e1ba
8 changed files with 164 additions and 15 deletions

7
app/models/mongo.rb Normal file
View file

@ -0,0 +1,7 @@
module Mongo
def self.table_name_prefix
"mongo_"
end
class User < ActiveRecord::Base; end
end

View file

@ -0,0 +1,24 @@
class CreateImportTables < ActiveRecord::Migration
def self.up
create_table :mongo_users do |t|
t.string :mongo_id
t.string :username
t.text :serialized_private_key
t.string :encrypted_password
t.integer :invites
t.string :invitation_token
t.datetime :invitation_sent_at
t.boolean :getting_started
t.boolean :disable_mail
t.string :language
t.string :last_sign_in_ip
t.datetime :last_sign_in_at
t.string :reset_password_token
t.string :password_salt
end
end
def self.down
drop_table :mongo_users
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 0) do
ActiveRecord::Schema.define(:version => 20110105051803) do
create_table "aspect_memberships", :force => true do |t|
t.integer "aspect_id"
@ -70,6 +70,23 @@ ActiveRecord::Schema.define(:version => 0) do
add_index "invitations", ["sender_id"], :name => "index_invitations_on_sender_id"
create_table "mongo_users", :force => true do |t|
t.string "mongo_id"
t.string "username"
t.text "serialized_private_key"
t.string "encrypted_password"
t.integer "invites"
t.string "invitation_token"
t.datetime "invitation_sent_at"
t.boolean "getting_started"
t.boolean "disable_mail"
t.string "language"
t.string "last_sign_in_ip"
t.datetime "last_sign_in_at"
t.string "reset_password_token"
t.string "password_salt"
end
create_table "notifications", :force => true do |t|
t.string "target_type"
t.integer "target_id"

View file

@ -4,11 +4,12 @@
module DataConversion
class Base
attr_accessor :start_time, :directory
attr_accessor :start_time, :directory, :full_path
def initialize(start_time = Time.now)
@start_time = start_time
@directory = "tmp/export-for-mysql"
@full_path = "#{Rails.root}/#{directory}"
end
def log(message)
@ -17,9 +18,5 @@ module DataConversion
end
Rails.logger.debug(message) if Rails.logger
end
def full_path
"#{Rails.root}/#{directory}"
end
end
end

View file

@ -1,8 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
module DataConversion
class ImportToMysql < DataConversion::Base
end
end

View file

@ -0,0 +1,21 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
module DataConversion
class ImportToMysql < DataConversion::Base
def import_raw
Mongo::User.connection.execute <<-SQL
LOAD DATA INFILE '#{full_path}/users.csv' INTO TABLE mongo_users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
IGNORE 1 LINES
(mongo_id, username, serialized_private_key, encrypted_password,
invites, invitation_token, invitation_sent_at, getting_started,
disable_mail, language, last_sign_in_ip, last_sign_in_at,
reset_password_token, password_salt)
SQL
end
end
end

53
spec/fixtures/data_conversion/users.csv vendored Normal file
View file

@ -0,0 +1,53 @@
mongo_id,username,serialized_private_key,encrypted_password,invites,invitation_token,invitation_sent_at,getting_started,disable_mail,language,last_sign_in_ip,last_sign_in_at,reset_password_token,password_salt
4d1513542367bc2525000002,beckett,"-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
",$2a$10$i7ulgssUfhg9lA.FxT2ugOiYSUh.91NvD9X21m1M2AkPRfxbkQv5W,5,,,false,false,en,127.0.0.1,1293241318000,,$2a$10$i7ulgssUfhg9lA.FxT2ugO
1 mongo_id username serialized_private_key encrypted_password invites invitation_token invitation_sent_at getting_started disable_mail language last_sign_in_ip last_sign_in_at reset_password_token password_salt
2 4d1513542367bc2525000002 beckett -----BEGIN RSA PRIVATE KEY----- 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 -----END RSA PRIVATE KEY----- $2a$10$i7ulgssUfhg9lA.FxT2ugOiYSUh.91NvD9X21m1M2AkPRfxbkQv5W 5 false false en 127.0.0.1 1293241318000 $2a$10$i7ulgssUfhg9lA.FxT2ugO

View file

@ -6,8 +6,46 @@ require 'spec_helper'
Dir.glob(File.join(Rails.root, 'lib', 'data_conversion', '*.rb')).each { |f| require f }
describe DataConversion::ImportToMysql do
def copy_fixture_for(table_name)
FileUtils.cp("#{Rails.root}/spec/fixtures/data_conversion/#{table_name}.csv",
"#{@migrator.full_path}/#{table_name}.csv")
end
before do
@migrator = DataConversion::ImportToMysql.new
@migrator.full_path = "/tmp/data_conversion"
system("rm -rf #{@migrator.full_path}")
FileUtils.mkdir_p(@migrator.full_path)
end
describe "#import_raw" do
describe "users" do
before do
copy_fixture_for("users")
end
it "imports data into the mongo_users table" do
Mongo::User.count.should == 0
@migrator.import_raw
Mongo::User.count.should == 1
end
it "imports all the columns" do
@migrator.import_raw
beckett = Mongo::User.first
beckett.mongo_id.should == "4d1513542367bc2525000002"
beckett.username.should == "beckett"
beckett.serialized_private_key.should_not be_nil
beckett.encrypted_password.should_not be_nil
beckett.invites.should == 5
beckett.invitation_token.should == ""
beckett.invitation_sent_at.should be_nil
beckett.getting_started.should be_false
beckett.disable_mail.should be_false
beckett.language.should == 'en'
beckett.last_sign_in_ip.should == '127.0.0.1'
beckett.last_sign_in_at.should_not be_nil
beckett.reset_password_token.should == ""
beckett.password_salt.should_not be_nil
end
end
end
end