diff --git a/Gemfile b/Gemfile index 8ecc621..3c96edc 100644 --- a/Gemfile +++ b/Gemfile @@ -6,3 +6,4 @@ gem 'minitest' gem 'pry' gem 'rake' gem 'rubocop' +gem 'sqlite3' diff --git a/Gemfile.lock b/Gemfile.lock index 3b3452f..c22e464 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -27,6 +27,7 @@ GEM unicode-display_width (~> 1.0, >= 1.0.1) ruby-progressbar (1.8.1) slop (3.6.0) + sqlite3 (1.3.13) unicode-display_width (1.1.3) PLATFORMS @@ -38,6 +39,7 @@ DEPENDENCIES rake rebel! rubocop + sqlite3 BUNDLED WITH 1.14.5 diff --git a/lib/rebel/sql.rb b/lib/rebel/sql.rb index 05d272e..3adb991 100644 --- a/lib/rebel/sql.rb +++ b/lib/rebel/sql.rb @@ -9,13 +9,17 @@ module Rebel::SQL exec(Rebel::SQL.create_table(table_name, desc)) end + def drop_table(table_name) + exec(Rebel::SQL.drop_table(table_name)) + end + def select(*fields, from: nil, where: nil, inner: nil, left: nil, right: nil) exec(Rebel::SQL.select(*fields, - from: from, - where: where, - inner: inner, - left: left, - right: right)) + from: from, + where: where, + inner: inner, + left: left, + right: right)) end def insert_into(table_name, *rows) @@ -77,6 +81,12 @@ module Rebel::SQL SQL end + def drop_table(table_name) + <<-SQL + DROP TABLE #{Rebel::SQL.name(table_name)}; + SQL + end + def select(*fields, from: nil, where: nil, inner: nil, left: nil, right: nil) <<-SQL SELECT #{names(*fields)} FROM #{name(from)} diff --git a/test/helper.rb b/test/helper.rb new file mode 100644 index 0000000..4e6708f --- /dev/null +++ b/test/helper.rb @@ -0,0 +1,8 @@ +require 'pry' +require 'sqlite3' + +def memdb + SQLite3::Database.new(':memory:').tap do |db| + db.class.instance_eval { alias_method :exec, :execute } + end +end diff --git a/test/test_exec.rb b/test/test_exec.rb new file mode 100644 index 0000000..cf7c18c --- /dev/null +++ b/test/test_exec.rb @@ -0,0 +1,49 @@ +require 'minitest/autorun' +require 'helper' +require 'rebel' + +class TestExec < Minitest::Test + include Rebel::SQL + + def setup + @conn = memdb + end + + def test_create_table + assert_raises(SQLite3::SQLException) { conn.execute('SELECT * FROM foo') } + create_table :foo, id: 'INT', col: 'VARCHAR(255)' + assert_equal(conn.execute('SELECT * FROM foo'), []) + end + + def test_drop_table + create_table :foo, id: 'INT', col: 'VARCHAR(255)' + assert_equal(conn.execute('SELECT * FROM foo'), []) + drop_table :foo + assert_raises(SQLite3::SQLException) { conn.execute('SELECT * FROM foo') } + end + + def test_insert_into + create_table :foo, id: 'INT', col: 'VARCHAR(255)' + insert_into :foo, id: 1, col: 'whatevs' + assert_equal(conn.execute('SELECT * FROM foo'), [[1, 'whatevs']]) + end + + def test_insert_into_with_many_values + create_table :foo, id: 'INT', col: 'VARCHAR(255)' + insert_into :foo, + { id: 1, col: 'more' }, + { id: 2, col: 'rows' }, + { id: 3, col: 'for the win' } + assert_equal(conn.execute('SELECT * FROM foo'), [ + [1, 'more'], + [2, 'rows'], + [3, 'for the win'], + ]) + end + + def test_select + create_table :foo, id: 'INT', col: 'VARCHAR(255)' + insert_into :foo, id: 1, col: 'whatevs' + assert_equal(select('*', from: :foo), [[1, 'whatevs']]) + end +end