cassanity 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +10 -0
  4. data/Gemfile +11 -0
  5. data/Guardfile +17 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +99 -0
  8. data/Rakefile +16 -0
  9. data/cassanity.gemspec +21 -0
  10. data/examples/_shared.rb +8 -0
  11. data/examples/batch.rb +40 -0
  12. data/examples/column_families.rb +68 -0
  13. data/examples/keyspaces.rb +57 -0
  14. data/lib/cassanity/argument_generators/batch.rb +52 -0
  15. data/lib/cassanity/argument_generators/column_family_alter.rb +47 -0
  16. data/lib/cassanity/argument_generators/column_family_create.rb +44 -0
  17. data/lib/cassanity/argument_generators/column_family_delete.rb +65 -0
  18. data/lib/cassanity/argument_generators/column_family_drop.rb +18 -0
  19. data/lib/cassanity/argument_generators/column_family_insert.rb +53 -0
  20. data/lib/cassanity/argument_generators/column_family_select.rb +34 -0
  21. data/lib/cassanity/argument_generators/column_family_truncate.rb +18 -0
  22. data/lib/cassanity/argument_generators/column_family_update.rb +69 -0
  23. data/lib/cassanity/argument_generators/index_create.rb +22 -0
  24. data/lib/cassanity/argument_generators/index_drop.rb +13 -0
  25. data/lib/cassanity/argument_generators/keyspace_create.rb +51 -0
  26. data/lib/cassanity/argument_generators/keyspace_drop.rb +13 -0
  27. data/lib/cassanity/argument_generators/keyspace_use.rb +13 -0
  28. data/lib/cassanity/argument_generators/keyspaces.rb +12 -0
  29. data/lib/cassanity/argument_generators/set_clause.rb +30 -0
  30. data/lib/cassanity/argument_generators/using_clause.rb +24 -0
  31. data/lib/cassanity/argument_generators/where_clause.rb +29 -0
  32. data/lib/cassanity/argument_generators/with_clause.rb +32 -0
  33. data/lib/cassanity/column_family.rb +233 -0
  34. data/lib/cassanity/connection.rb +88 -0
  35. data/lib/cassanity/error.rb +28 -0
  36. data/lib/cassanity/executors/cassandra_cql.rb +120 -0
  37. data/lib/cassanity/keyspace.rb +118 -0
  38. data/lib/cassanity/result_transformers/column_family_select.rb +15 -0
  39. data/lib/cassanity/result_transformers/mirror.rb +12 -0
  40. data/lib/cassanity/schema.rb +26 -0
  41. data/lib/cassanity/version.rb +3 -0
  42. data/lib/cassanity.rb +5 -0
  43. data/spec/helper.rb +27 -0
  44. data/spec/integration/cassanity/column_family_spec.rb +243 -0
  45. data/spec/integration/cassanity/connection_spec.rb +87 -0
  46. data/spec/integration/cassanity/keyspace_spec.rb +64 -0
  47. data/spec/support/cassanity_helpers.rb +35 -0
  48. data/spec/unit/cassanity/argument_generators/batch_spec.rb +36 -0
  49. data/spec/unit/cassanity/argument_generators/column_family_alter_spec.rb +85 -0
  50. data/spec/unit/cassanity/argument_generators/column_family_create_spec.rb +107 -0
  51. data/spec/unit/cassanity/argument_generators/column_family_delete_spec.rb +92 -0
  52. data/spec/unit/cassanity/argument_generators/column_family_drop_spec.rb +25 -0
  53. data/spec/unit/cassanity/argument_generators/column_family_insert_spec.rb +70 -0
  54. data/spec/unit/cassanity/argument_generators/column_family_select_spec.rb +113 -0
  55. data/spec/unit/cassanity/argument_generators/column_family_truncate_spec.rb +25 -0
  56. data/spec/unit/cassanity/argument_generators/column_family_update_spec.rb +109 -0
  57. data/spec/unit/cassanity/argument_generators/index_create_spec.rb +39 -0
  58. data/spec/unit/cassanity/argument_generators/index_drop_spec.rb +14 -0
  59. data/spec/unit/cassanity/argument_generators/keyspace_create_spec.rb +53 -0
  60. data/spec/unit/cassanity/argument_generators/keyspace_drop_spec.rb +14 -0
  61. data/spec/unit/cassanity/argument_generators/keyspace_use_spec.rb +14 -0
  62. data/spec/unit/cassanity/argument_generators/keyspaces_spec.rb +12 -0
  63. data/spec/unit/cassanity/argument_generators/set_clause_spec.rb +85 -0
  64. data/spec/unit/cassanity/argument_generators/using_clause_spec.rb +44 -0
  65. data/spec/unit/cassanity/argument_generators/where_clause_spec.rb +57 -0
  66. data/spec/unit/cassanity/argument_generators/with_clause_spec.rb +63 -0
  67. data/spec/unit/cassanity/column_family_spec.rb +250 -0
  68. data/spec/unit/cassanity/connection_spec.rb +75 -0
  69. data/spec/unit/cassanity/error_spec.rb +35 -0
  70. data/spec/unit/cassanity/executors/cassandra_cql_spec.rb +178 -0
  71. data/spec/unit/cassanity/keyspace_spec.rb +137 -0
  72. data/spec/unit/cassanity/result_transformers/column_family_select_spec.rb +0 -0
  73. data/spec/unit/cassanity/result_transformers/mirror_spec.rb +12 -0
  74. data/spec/unit/cassanity/schema_spec.rb +23 -0
  75. data/spec/unit/cassanity_spec.rb +5 -0
  76. metadata +172 -0
@@ -0,0 +1,64 @@
1
+ require 'helper'
2
+ require 'cassanity/keyspace'
3
+ require 'cassanity/executors/cassandra_cql'
4
+
5
+ describe Cassanity::Keyspace do
6
+ let(:keyspace_name) { 'cassanity_test' }
7
+ let(:self_created_keyspace_name) { 'self_created' }
8
+ let(:column_family_name) { 'apps' }
9
+
10
+ let(:client) {
11
+ CassandraCQL::Database.new('127.0.0.1:9160', {
12
+ cql_version: '3.0.0',
13
+ })
14
+ }
15
+
16
+ let(:executor) {
17
+ Cassanity::Executors::CassandraCql.new({
18
+ client: client,
19
+ })
20
+ }
21
+
22
+ let(:required_arguments) {
23
+ {
24
+ name: keyspace_name,
25
+ executor: executor,
26
+ }
27
+ }
28
+
29
+ subject {
30
+ described_class.new(required_arguments)
31
+ }
32
+
33
+ before do
34
+ client_drop_keyspace(client, keyspace_name)
35
+ client_create_keyspace(client, keyspace_name)
36
+ end
37
+
38
+ after do
39
+ client_drop_keyspace(client, keyspace_name)
40
+ client_drop_keyspace(client, self_created_keyspace_name)
41
+ end
42
+
43
+ it "can create" do
44
+ client_keyspace?(client, self_created_keyspace_name).should be_false
45
+ instance = described_class.new(required_arguments.merge({
46
+ name: self_created_keyspace_name,
47
+ }))
48
+ instance.create
49
+ client_keyspace?(client, self_created_keyspace_name).should be_true
50
+ end
51
+
52
+ it "can use" do
53
+ client.execute("USE system")
54
+ client.keyspace.should_not eq(keyspace_name)
55
+ subject.use
56
+ client.keyspace.should eq(keyspace_name)
57
+ end
58
+
59
+ it "can drop" do
60
+ client_keyspace?(client, keyspace_name).should be_true
61
+ subject.drop
62
+ client_keyspace?(client, keyspace_name).should be_false
63
+ end
64
+ end
@@ -0,0 +1,35 @@
1
+ module CassanityHelpers
2
+ def client_keyspace?(client, name)
3
+ client.keyspaces.map(&:name).include?(name.to_s)
4
+ end
5
+
6
+ def client_create_keyspace(client, name)
7
+ unless client_keyspace?(client, name)
8
+ client.execute("CREATE KEYSPACE #{name} WITH strategy_class = 'SimpleStrategy' AND strategy_options:replication_factor = 1")
9
+ end
10
+ client.execute("USE #{name}")
11
+ end
12
+
13
+ def client_drop_keyspace(client, name)
14
+ if client_keyspace?(client, name)
15
+ client.execute("DROP KEYSPACE #{name}")
16
+ end
17
+ end
18
+
19
+ def client_column_family?(client, name)
20
+ client.schema.column_family_names.include?(name.to_s)
21
+ end
22
+
23
+ def client_create_column_family(client, name, columns = nil)
24
+ columns ||= "id text PRIMARY KEY, name text"
25
+ unless client_column_family?(client, name)
26
+ client.execute("CREATE COLUMNFAMILY #{name} (#{columns})")
27
+ end
28
+ end
29
+
30
+ def client_drop_column_family(client, name)
31
+ if client_column_family?(client, name)
32
+ client.execute("DROP COLUMNFAMILY #{name}")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/batch'
3
+
4
+ describe Cassanity::ArgumentGenerators::Batch do
5
+ describe "#call" do
6
+ it "returns array of arguments" do
7
+ cql = "BEGIN BATCH INSERT INTO users (id) VALUES (?) UPDATE users SET name = ? WHERE id = ? DELETE FROM users WHERE id = ? APPLY BATCH"
8
+ subject.call({
9
+ modifications: [
10
+ [:insert, name: :users, data: {id: '1'}],
11
+ [:update, name: :users, set: {name: 'GitHub'}, where: {id: '1'}],
12
+ [:delete, name: :users, where: {id: '1'}],
13
+ ],
14
+ }).should eq([cql, '1', 'GitHub', '1', '1'])
15
+ end
16
+
17
+ context "with :using key" do
18
+ subject {
19
+ described_class.new({
20
+ using_clause: lambda { |args|
21
+ [" USING TIMESTAMP = #{args.fetch(:using).fetch(:timestamp)}"]
22
+ }
23
+ })
24
+ }
25
+
26
+ it "uses using clause to get additional cql and bound variables" do
27
+ cql = "BEGIN BATCH USING TIMESTAMP = 500 APPLY BATCH"
28
+ subject.call({
29
+ using: {
30
+ timestamp: 500,
31
+ },
32
+ }).should eq([cql])
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,85 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_alter'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyAlter do
5
+ describe "#call" do
6
+ it "returns array of arguments" do
7
+ cql = "ALTER COLUMNFAMILY apps"
8
+ expected = [cql]
9
+ subject.call({
10
+ name: :apps,
11
+ }).should eq(expected)
12
+ end
13
+
14
+ context "with :keyspace_name" do
15
+ it "returns array of arguments including keyspace name" do
16
+ cql = "ALTER COLUMNFAMILY foo.apps"
17
+ expected = [cql]
18
+ subject.call({
19
+ name: :apps,
20
+ keyspace_name: 'foo',
21
+ }).should eq(expected)
22
+ end
23
+ end
24
+
25
+ context "altering a column type" do
26
+ it "returns array of arguments" do
27
+ cql = "ALTER COLUMNFAMILY apps ALTER created_at TYPE timestamp"
28
+ expected = [cql]
29
+ subject.call({
30
+ name: :apps,
31
+ alter: {
32
+ created_at: :timestamp,
33
+ },
34
+ }).should eq(expected)
35
+ end
36
+ end
37
+
38
+ context "adding a column" do
39
+ it "returns array of arguments" do
40
+ cql = "ALTER COLUMNFAMILY apps ADD created_at timestamp"
41
+ expected = [cql]
42
+ subject.call({
43
+ name: :apps,
44
+ add: {
45
+ created_at: :timestamp,
46
+ },
47
+ }).should eq(expected)
48
+ end
49
+ end
50
+
51
+ context "dropping a column" do
52
+ it "returns array of arguments" do
53
+ cql = "ALTER COLUMNFAMILY apps DROP created_at"
54
+ expected = [cql]
55
+ subject.call({
56
+ name: :apps,
57
+ drop: :created_at,
58
+ }).should eq(expected)
59
+ end
60
+ end
61
+
62
+ context "altering column family WITH options" do
63
+ let(:with_clause) {
64
+ lambda { |args| [" WITH comment = ?", 'Testing']}
65
+ }
66
+
67
+ subject {
68
+ described_class.new({
69
+ with_clause: with_clause,
70
+ })
71
+ }
72
+
73
+ it "returns array of arguments with help from the with_clause" do
74
+ cql = "ALTER COLUMNFAMILY apps WITH comment = ?"
75
+ expected = [cql, 'Testing']
76
+ subject.call({
77
+ name: :apps,
78
+ with: {
79
+ comment: 'Testing',
80
+ }
81
+ }).should eq(expected)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,107 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_create'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyCreate do
5
+ let(:column_family_name) { 'tracks' }
6
+
7
+ let(:schema) {
8
+ Cassanity::Schema.new({
9
+ primary_key: :id,
10
+ columns: {
11
+ id: :text,
12
+ name: :text
13
+ },
14
+ })
15
+ }
16
+
17
+ describe "#call" do
18
+ context "when missing required argument key" do
19
+ let(:required_arguments) {
20
+ {
21
+ name: 'tracks',
22
+ schema: schema,
23
+ }
24
+ }
25
+
26
+ [:name, :schema].each do |key|
27
+ it "raises error if missing :#{key} key" do
28
+ args = required_arguments.reject { |k, v| k == key }
29
+ expect { subject.call(args) }.to raise_error(KeyError)
30
+ end
31
+ end
32
+ end
33
+
34
+ context "when using single primary key" do
35
+ it "returns array of arguments" do
36
+ cql = "CREATE COLUMNFAMILY #{column_family_name} (id text, name text, PRIMARY KEY (id))"
37
+ expected = [cql]
38
+ subject.call({
39
+ name: column_family_name,
40
+ schema: schema,
41
+ }).should eq(expected)
42
+ end
43
+ end
44
+
45
+ context "when including :keyspace_name" do
46
+ it "returns array of arguments" do
47
+ cql = "CREATE COLUMNFAMILY foo.#{column_family_name} (id text, name text, PRIMARY KEY (id))"
48
+ expected = [cql]
49
+ subject.call({
50
+ keyspace_name: :foo,
51
+ name: column_family_name,
52
+ schema: schema,
53
+ }).should eq(expected)
54
+ end
55
+ end
56
+
57
+ context "when using composite primary key" do
58
+ it "returns array of arguments" do
59
+ schema = Cassanity::Schema.new({
60
+ primary_key: [:segment, :track_id],
61
+ columns: {
62
+ segment: :text,
63
+ track_id: :timeuuid,
64
+ page: :text,
65
+ },
66
+ })
67
+ cql = "CREATE COLUMNFAMILY #{column_family_name} (segment text, track_id timeuuid, page text, PRIMARY KEY (segment, track_id))"
68
+ expected = [cql]
69
+ subject.call({
70
+ name: column_family_name,
71
+ schema: schema,
72
+ }).should eq(expected)
73
+ end
74
+ end
75
+
76
+ context "when using WITH options" do
77
+ let(:with_clause) {
78
+ lambda { |args| [" WITH comment = ?", 'Testing']}
79
+ }
80
+
81
+ subject {
82
+ described_class.new({
83
+ with_clause: with_clause,
84
+ })
85
+ }
86
+
87
+ it "returns array of arguments with help from the with_clause" do
88
+ schema = Cassanity::Schema.new({
89
+ primary_key: :id,
90
+ columns: {
91
+ id: :text,
92
+ name: :text,
93
+ },
94
+ with: {
95
+ comment: "Testing",
96
+ }
97
+ })
98
+ cql = "CREATE COLUMNFAMILY apps (id text, name text, PRIMARY KEY (id)) WITH comment = ?"
99
+ expected = [cql, 'Testing']
100
+ subject.call({
101
+ name: :apps,
102
+ schema: schema,
103
+ }).should eq(expected)
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,92 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_delete'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyDelete do
5
+ let(:column_family_name) { 'apps' }
6
+
7
+ describe "#call" do
8
+ it "returns array of arguments" do
9
+ cql = "DELETE FROM #{column_family_name} WHERE id = ?"
10
+ expected = [cql, '1']
11
+ subject.call({
12
+ name: column_family_name,
13
+ where: {
14
+ id: '1',
15
+ }
16
+ }).should eq(expected)
17
+ end
18
+
19
+ context "with :keyspace_name" do
20
+ it "returns array of arguments" do
21
+ cql = "DELETE FROM foo.#{column_family_name} WHERE id = ?"
22
+ expected = [cql, '1']
23
+ subject.call({
24
+ keyspace_name: :foo,
25
+ name: column_family_name,
26
+ where: {
27
+ id: '1',
28
+ }
29
+ }).should eq(expected)
30
+ end
31
+ end
32
+
33
+ context "with specific columns" do
34
+ it "returns array of arguments only deleting specific columns" do
35
+ cql = "DELETE foo, bar FROM #{column_family_name} WHERE id = ?"
36
+ expected = [cql, '1']
37
+ subject.call({
38
+ name: column_family_name,
39
+ columns: [:foo, :bar],
40
+ where: {
41
+ id: '1',
42
+ }
43
+ }).should eq(expected)
44
+ end
45
+ end
46
+
47
+ context "with :where key" do
48
+ subject {
49
+ described_class.new({
50
+ where_clause: lambda { |args|
51
+ [" WHERE id = ?", args.fetch(:where).fetch(:id)]
52
+ }
53
+ })
54
+ }
55
+
56
+ it "uses where clause to get additional cql and bound variables" do
57
+ cql = "DELETE FROM #{column_family_name} WHERE id = ?"
58
+ expected = [cql, '4']
59
+ subject.call({
60
+ name: column_family_name,
61
+ where: {
62
+ id: '4',
63
+ }
64
+ }).should eq(expected)
65
+ end
66
+ end
67
+
68
+ context "with :using key" do
69
+ subject {
70
+ described_class.new({
71
+ using_clause: lambda { |args|
72
+ [" USING TTL = #{args.fetch(:using).fetch(:ttl)}"]
73
+ }
74
+ })
75
+ }
76
+
77
+ it "uses using clause to get additional cql and bound variables" do
78
+ cql = "DELETE FROM #{column_family_name} USING TTL = 500 WHERE id = ?"
79
+ expected = [cql, '4']
80
+ subject.call({
81
+ name: column_family_name,
82
+ using: {
83
+ ttl: 500,
84
+ },
85
+ where: {
86
+ id: '4',
87
+ }
88
+ }).should eq(expected)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_drop'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyDrop do
5
+ let(:column_family_name) { 'apps' }
6
+
7
+ describe "#call" do
8
+ it "returns array of arguments" do
9
+ cql = "DROP COLUMNFAMILY #{column_family_name}"
10
+ expected = [cql]
11
+ subject.call(name: column_family_name).should eq(expected)
12
+ end
13
+
14
+ context "with :keyspace_name" do
15
+ it "returns array of arguments" do
16
+ cql = "DROP COLUMNFAMILY foo.#{column_family_name}"
17
+ expected = [cql]
18
+ subject.call({
19
+ keyspace_name: :foo,
20
+ name: column_family_name
21
+ }).should eq(expected)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,70 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_insert'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyInsert do
5
+ let(:column_family_name) { 'apps' }
6
+
7
+ describe "#call" do
8
+ [:name, :data].each do |key|
9
+ it "raises error if missing :#{key} key" do
10
+ required_arguments = {
11
+ name: column_family_name,
12
+ data: {
13
+ id: '1',
14
+ name: 'GitHub',
15
+ }
16
+ }
17
+
18
+ args = required_arguments.reject { |k, v| k == key }
19
+ expect { subject.call(args) }.to raise_error(KeyError)
20
+ end
21
+ end
22
+
23
+ it "returns array of arguments" do
24
+ cql = "INSERT INTO #{column_family_name} (id, name) VALUES (?, ?)"
25
+ expected = [cql, '1', 'GitHub']
26
+ subject.call({
27
+ name: column_family_name,
28
+ data: {
29
+ id: '1',
30
+ name: 'GitHub',
31
+ }
32
+ }).should eq(expected)
33
+ end
34
+
35
+ context "with :keyspace_name" do
36
+ it "returns array of arguments" do
37
+ cql = "INSERT INTO foo.#{column_family_name} (id, name) VALUES (?, ?)"
38
+ expected = [cql, '1', 'GitHub']
39
+ subject.call({
40
+ keyspace_name: :foo,
41
+ name: column_family_name,
42
+ data: {
43
+ id: '1',
44
+ name: 'GitHub',
45
+ }
46
+ }).should eq(expected)
47
+ end
48
+ end
49
+
50
+ context "with :using key" do
51
+ it "returns array of arguments including using in cql string" do
52
+ millis = (Time.mktime(2012, 11, 1, 14, 9, 9).to_f * 1000).to_i
53
+ cql = "INSERT INTO #{column_family_name} (id, name) VALUES (?, ?) USING TTL 86400 AND TIMESTAMP #{millis} AND CONSISTENCY quorum"
54
+ expected = [cql, '1', 'GitHub']
55
+ subject.call({
56
+ name: column_family_name,
57
+ data: {
58
+ id: '1',
59
+ name: 'GitHub',
60
+ },
61
+ using: {
62
+ ttl: 86400,
63
+ timestamp: millis,
64
+ consistency: 'quorum',
65
+ }
66
+ }).should eq(expected)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,113 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_select'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilySelect do
5
+ let(:column_family_name) { 'apps' }
6
+
7
+ describe "#call" do
8
+ it "returns array of arguments" do
9
+ cql = "SELECT * FROM #{column_family_name}"
10
+ expected = [cql]
11
+ subject.call(name: column_family_name).should eq(expected)
12
+ end
13
+
14
+ context "with :keyspace_name" do
15
+ it "returns array of arguments" do
16
+ cql = "SELECT * FROM foo.#{column_family_name}"
17
+ expected = [cql]
18
+ subject.call({
19
+ keyspace_name: :foo,
20
+ name: column_family_name
21
+ }).should eq(expected)
22
+ end
23
+ end
24
+
25
+ context "with single column" do
26
+ it "returns array of arguments querying only one column" do
27
+ cql = "SELECT name FROM #{column_family_name}"
28
+ expected = [cql]
29
+ subject.call({
30
+ name: column_family_name,
31
+ select: :name,
32
+ }).should eq(expected)
33
+ end
34
+ end
35
+
36
+ context "with multiple columns" do
37
+ it "returns array of arguments querying multiple columns" do
38
+ cql = "SELECT id, name, created_at FROM #{column_family_name}"
39
+ expected = [cql]
40
+ subject.call({
41
+ name: column_family_name,
42
+ select: [:id, :name, :created_at],
43
+ }).should eq(expected)
44
+ end
45
+ end
46
+
47
+ context "with count *" do
48
+ it "returns array of arguments querying multiple columns" do
49
+ cql = "SELECT COUNT(*) FROM #{column_family_name}"
50
+ expected = [cql]
51
+ subject.call({
52
+ name: column_family_name,
53
+ select: 'COUNT(*)',
54
+ }).should eq(expected)
55
+ end
56
+ end
57
+
58
+ context "with count 1" do
59
+ it "returns array of arguments querying multiple columns" do
60
+ cql = "SELECT COUNT(1) FROM #{column_family_name}"
61
+ expected = [cql]
62
+ subject.call({
63
+ name: column_family_name,
64
+ select: 'COUNT(1)',
65
+ }).should eq(expected)
66
+ end
67
+ end
68
+
69
+ context "with WRITETIME" do
70
+ it "returns array of arguments querying multiple columns" do
71
+ cql = "SELECT WRITETIME(name) FROM #{column_family_name}"
72
+ expected = [cql]
73
+ subject.call({
74
+ name: column_family_name,
75
+ select: 'WRITETIME(name)',
76
+ }).should eq(expected)
77
+ end
78
+ end
79
+
80
+ context "with TTL" do
81
+ it "returns array of arguments querying multiple columns" do
82
+ cql = "SELECT TTL(name) FROM #{column_family_name}"
83
+ expected = [cql]
84
+ subject.call({
85
+ name: column_family_name,
86
+ select: 'TTL(name)',
87
+ }).should eq(expected)
88
+ end
89
+ end
90
+
91
+ context "with where option" do
92
+ let(:where_clause) {
93
+ lambda { |args| [" WHERE foo = ?", args.fetch(:where).fetch(:foo)]}
94
+ }
95
+
96
+ subject {
97
+ described_class.new({
98
+ where_clause: where_clause,
99
+ })
100
+ }
101
+
102
+ it "returns array of arguments with help from where clause" do
103
+ where = {foo: 'bar'}
104
+ cql = "SELECT * FROM #{column_family_name} WHERE foo = ?"
105
+ expected = [cql, 'bar']
106
+ subject.call({
107
+ name: column_family_name,
108
+ where: where,
109
+ }).should eq(expected)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+ require 'cassanity/argument_generators/column_family_truncate'
3
+
4
+ describe Cassanity::ArgumentGenerators::ColumnFamilyTruncate do
5
+ let(:column_family_name) { 'apps' }
6
+
7
+ describe "#call" do
8
+ it "returns array of arguments" do
9
+ cql = "TRUNCATE #{column_family_name}"
10
+ expected = [cql]
11
+ subject.call(name: column_family_name).should eq(expected)
12
+ end
13
+
14
+ context "with :keyspace_name" do
15
+ it "returns array of arguments" do
16
+ cql = "TRUNCATE foo.#{column_family_name}"
17
+ expected = [cql]
18
+ subject.call({
19
+ keyspace_name: :foo,
20
+ name: column_family_name
21
+ }).should eq(expected)
22
+ end
23
+ end
24
+ end
25
+ end