sequel 0.3.0.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -265,7 +265,7 @@ context "Database#table_exists?" do
265
265
  @db.table_exists?(:c).should be_false
266
266
  end
267
267
 
268
- specify "should otherise try to select the first record from the table's dataset" do
268
+ specify "should otherwise try to select the first record from the table's dataset" do
269
269
  @db2.table_exists?(:a).should be_false
270
270
  @db2.table_exists?(:b).should be_true
271
271
  end
data/spec/dataset_spec.rb CHANGED
@@ -119,6 +119,22 @@ context "A simple dataset" do
119
119
  @dataset.insert_sql(v).should == "INSERT INTO test DEFAULT VALUES;"
120
120
  end
121
121
 
122
+ specify "should format an insert statement with a model instance" do
123
+ dbb = Sequel::Database.new
124
+
125
+ @c = Class.new(Sequel::Model) do
126
+ db = dbb
127
+ set_dataset Sequel::Dataset.new(dbb)
128
+ end
129
+
130
+ v = @c.new(:a => 1)
131
+
132
+ @dataset.insert_sql(v).should == "INSERT INTO test (a) VALUES (1);"
133
+
134
+ v = @c.new({})
135
+ @dataset.insert_sql(v).should == "INSERT INTO test DEFAULT VALUES;"
136
+ end
137
+
122
138
  specify "should format an insert statement with an arbitrary value" do
123
139
  @dataset.insert_sql(123).should == "INSERT INTO test VALUES (123);"
124
140
  end
@@ -425,7 +441,7 @@ context "Dataset#exclude" do
425
441
  "SELECT * FROM test WHERE (NOT (region = 'Asia' AND name = 'Japan'))"
426
442
  end
427
443
 
428
- specify "should corrently parenthesize when it is used twice" do
444
+ specify "should correctly parenthesize when it is used twice" do
429
445
  @dataset.exclude(:region => 'Asia').exclude(:name => 'Japan').select_sql.should ==
430
446
  "SELECT * FROM test WHERE (NOT (region = 'Asia')) AND (NOT (name = 'Japan'))"
431
447
  end
@@ -858,7 +874,7 @@ context "Dataset#count" do
858
874
  @dataset = @c.new(nil).from(:test)
859
875
  end
860
876
 
861
- specify "should format SQL propertly" do
877
+ specify "should format SQL properly" do
862
878
  @dataset.count.should == 1
863
879
  @c.sql.should == 'SELECT COUNT(*) FROM test'
864
880
  end
@@ -918,7 +934,7 @@ context "Dataset#join_table" do
918
934
  'SELECT * FROM items INNER JOIN b ON (b.items_id = items.id) LEFT OUTER JOIN c ON (c.b_id = b.id)'
919
935
  end
920
936
 
921
- specify "should use id as implicit relation primary key if ommited" do
937
+ specify "should use id as implicit relation primary key if omitted" do
922
938
  @d.join_table(:left_outer, :categories, :category_id).sql.should ==
923
939
  @d.join_table(:left_outer, :categories, :category_id => :id).sql
924
940
 
@@ -1725,7 +1741,7 @@ context "Dataset#multi_insert" do
1725
1741
  ]
1726
1742
  end
1727
1743
 
1728
- specify "should accept the commit_every option for commiting every x records" do
1744
+ specify "should accept the commit_every option for committing every x records" do
1729
1745
  @ds.multi_insert(@list, :commit_every => 2)
1730
1746
  @db.sqls.should == [
1731
1747
  'BEGIN;',
@@ -212,7 +212,7 @@ context "Sequel::Migrator" do
212
212
  Sequel::Migrator.get_current_migration_version(@db).should == 4321
213
213
  end
214
214
 
215
- specify "should set the migration versison stored in the datbase" do
215
+ specify "should set the migration version stored in the database" do
216
216
  Sequel::Migrator.get_current_migration_version(@db).should == 0
217
217
  Sequel::Migrator.set_current_migration_version(@db, 6666)
218
218
  Sequel::Migrator.get_current_migration_version(@db).should == 6666
data/spec/model_spec.rb CHANGED
@@ -28,7 +28,6 @@ describe Sequel::Model do
28
28
  end
29
29
 
30
30
  describe Sequel::Model, 'w/ primary key' do
31
-
32
31
  it "should default to ':id'" do
33
32
  model_a = Class.new Sequel::Model
34
33
  model_a.primary_key.should be_equal(:id)
@@ -48,11 +47,9 @@ describe Sequel::Model, 'w/ primary key' do
48
47
  model_a = Class.new(Sequel::Model) { set_primary_key [:a, :b] }
49
48
  model_a.primary_key.should be_eql([:a, :b])
50
49
  end
51
-
52
50
  end
53
51
 
54
52
  describe Sequel::Model, 'w/o primary key' do
55
-
56
53
  it "should return nil for primary key" do
57
54
  Class.new(Sequel::Model) { no_primary_key }.primary_key.should be_nil
58
55
  end
@@ -61,7 +58,6 @@ describe Sequel::Model, 'w/o primary key' do
61
58
  instance = Class.new(Sequel::Model) { no_primary_key }.new
62
59
  proc { instance.this }.should raise_error(SequelError)
63
60
  end
64
-
65
61
  end
66
62
 
67
63
  describe Sequel::Model, 'with this' do
@@ -256,13 +252,13 @@ context "A model class" do
256
252
  specify "should be able to create rows in the associated table" do
257
253
  o = @c.create(:x => 1)
258
254
  o.class.should == @c
259
- MODEL_DB.sqls.should == ['INSERT INTO items (x) VALUES (1);']
255
+ MODEL_DB.sqls.should == ['INSERT INTO items (x) VALUES (1);', "SELECT * FROM items WHERE (id IN ('INSERT INTO items (x) VALUES (1);')) LIMIT 1"]
260
256
  end
261
257
 
262
258
  specify "should be able to create rows without any values specified" do
263
259
  o = @c.create
264
260
  o.class.should == @c
265
- MODEL_DB.sqls.should == ['INSERT INTO items DEFAULT VALUES;']
261
+ MODEL_DB.sqls.should == ["INSERT INTO items DEFAULT VALUES;", "SELECT * FROM items WHERE (id IN ('INSERT INTO items DEFAULT VALUES;')) LIMIT 1"]
266
262
  end
267
263
  end
268
264
 
@@ -404,13 +400,6 @@ context "Model attribute accessors" do
404
400
  [:id, :x, :y]
405
401
  end
406
402
  end
407
-
408
- ds = @c.dataset
409
- ds.extend(Module.new {
410
- def columns
411
- [:id, :x, :y]
412
- end
413
- })
414
403
  end
415
404
 
416
405
  specify "should be created dynamically" do
@@ -433,7 +422,26 @@ context "Model attribute accessors" do
433
422
  proc {o.xx}.should raise_error(SequelError)
434
423
 
435
424
  proc {o.x = 3}.should_not raise_error
436
- proc {o.yy = 4}.should raise_error
425
+ proc {o.yy = 4}.should raise_error(SequelError)
426
+
427
+ proc {o.yy?}.should raise_error(NoMethodError)
428
+ end
429
+
430
+ specify "should not raise for a column not in the dataset, but for which there's a value" do
431
+ o = @c.new
432
+
433
+ proc {o.xx}.should raise_error(SequelError)
434
+ proc {o.yy}.should raise_error(SequelError)
435
+
436
+ o.values[:xx] = 123
437
+ o.values[:yy] = nil
438
+
439
+ proc {o.xx; o.yy}.should_not raise_error(SequelError)
440
+
441
+ o.xx.should == 123
442
+ o.yy.should == nil
443
+
444
+ proc {o.xx = 3}.should raise_error(SequelError)
437
445
  end
438
446
  end
439
447
 
@@ -482,8 +490,8 @@ context "Model.after_create" do
482
490
  end
483
491
 
484
492
  n = @c.create(:x => 1)
485
- MODEL_DB.sqls.should == ['INSERT INTO items (x) VALUES (1);']
486
- s.should == ['INSERT INTO items (x) VALUES (1);']
493
+ MODEL_DB.sqls.should == ["INSERT INTO items (x) VALUES (1);", "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
494
+ s.should == ["INSERT INTO items (x) VALUES (1);", "SELECT * FROM items WHERE (id = 1) LIMIT 1"]
487
495
  end
488
496
 
489
497
  specify "should allow calling save in the hook" do
@@ -494,7 +502,7 @@ context "Model.after_create" do
494
502
  end
495
503
 
496
504
  n = @c.create(:id => 1)
497
- MODEL_DB.sqls.should == ['INSERT INTO items (id) VALUES (1);', 'UPDATE items SET id = 2 WHERE (id = 1)']
505
+ MODEL_DB.sqls.should == ["INSERT INTO items (id) VALUES (1);", "SELECT * FROM items WHERE (id = 1) LIMIT 1", "UPDATE items SET id = 2 WHERE (id = 1)"]
498
506
  end
499
507
  end
500
508
 
@@ -502,11 +510,7 @@ context "Model.subset" do
502
510
  setup do
503
511
  MODEL_DB.reset
504
512
 
505
- @c = Class.new(Sequel::Model(:items)) do
506
- def columns
507
- [:id, :x, :y]
508
- end
509
- end
513
+ @c = Class.new(Sequel::Model(:items))
510
514
  end
511
515
 
512
516
  specify "should create a filter on the underlying dataset" do
@@ -532,11 +536,7 @@ context "Model.find" do
532
536
  setup do
533
537
  MODEL_DB.reset
534
538
 
535
- @c = Class.new(Sequel::Model(:items)) do
536
- def self.columns
537
- [:name, :id]
538
- end
539
- end
539
+ @c = Class.new(Sequel::Model(:items))
540
540
 
541
541
  $cache_dataset_row = {:name => 'sharon', :id => 1}
542
542
  @dataset = @c.dataset
@@ -570,11 +570,7 @@ context "Model.[]" do
570
570
  setup do
571
571
  MODEL_DB.reset
572
572
 
573
- @c = Class.new(Sequel::Model(:items)) do
574
- def self.columns
575
- [:name, :id]
576
- end
577
- end
573
+ @c = Class.new(Sequel::Model(:items))
578
574
 
579
575
  $cache_dataset_row = {:name => 'sharon', :id => 1}
580
576
  @dataset = @c.dataset
@@ -761,4 +757,216 @@ context "A cached model" do
761
757
  "SELECT * FROM items WHERE (id = 1) LIMIT 1", \
762
758
  "SELECT * FROM items WHERE (id = 4) LIMIT 1"]
763
759
  end
760
+ end
761
+
762
+ context "Model.one_to_one" do
763
+ setup do
764
+ MODEL_DB.reset
765
+
766
+ @c1 = Class.new(Sequel::Model(:attributes)) do
767
+ end
768
+
769
+ @c2 = Class.new(Sequel::Model(:nodes)) do
770
+ end
771
+
772
+ @dataset = @c2.dataset
773
+
774
+ $sqls = []
775
+ @dataset.extend(Module.new {
776
+ def fetch_rows(sql)
777
+ $sqls << sql
778
+ yield({:hey => 1})
779
+ end
780
+
781
+ def update(values)
782
+ $sqls << update_sql(values)
783
+ end
784
+ })
785
+ end
786
+
787
+ specify "should use implicit key if omitted" do
788
+ @c2.one_to_one :parent, :from => @c2
789
+
790
+ d = @c2.new(:id => 1, :parent_id => 234)
791
+ p = d.parent
792
+ p.class.should == @c2
793
+ p.values.should == {:hey => 1}
794
+
795
+ $sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
796
+ end
797
+
798
+ specify "should use explicit key if given" do
799
+ @c2.one_to_one :parent, :from => @c2, :key => :blah
800
+
801
+ d = @c2.new(:id => 1, :blah => 567)
802
+ p = d.parent
803
+ p.class.should == @c2
804
+ p.values.should == {:hey => 1}
805
+
806
+ $sqls.should == ["SELECT * FROM nodes WHERE (id = 567) LIMIT 1"]
807
+ end
808
+
809
+ specify "should support plain dataset in the from option" do
810
+ @c2.one_to_one :parent, :from => MODEL_DB[:xyz]
811
+
812
+ d = @c2.new(:id => 1, :parent_id => 789)
813
+ p = d.parent
814
+ p.class.should == Hash
815
+
816
+ MODEL_DB.sqls.should == ["SELECT * FROM xyz WHERE (id = 789) LIMIT 1"]
817
+ end
818
+
819
+ specify "should support table name in the from option" do
820
+ @c2.one_to_one :parent, :from => :abc
821
+
822
+ d = @c2.new(:id => 1, :parent_id => 789)
823
+ p = d.parent
824
+ p.class.should == Hash
825
+
826
+ MODEL_DB.sqls.should == ["SELECT * FROM abc WHERE (id = 789) LIMIT 1"]
827
+ end
828
+
829
+ specify "should return nil if key value is nil" do
830
+ @c2.one_to_one :parent, :from => @c2
831
+
832
+ d = @c2.new(:id => 1)
833
+ d.parent.should == nil
834
+ end
835
+
836
+ specify "should define a setter method" do
837
+ @c2.one_to_one :parent, :from => @c2
838
+
839
+ d = @c2.new(:id => 1)
840
+ d.parent = {:id => 4321}
841
+ d.values.should == {:id => 1, :parent_id => 4321}
842
+ $sqls.last.should == "UPDATE nodes SET parent_id = 4321 WHERE (id = 1)"
843
+
844
+ d.parent = nil
845
+ d.values.should == {:id => 1, :parent_id => nil}
846
+ $sqls.last.should == "UPDATE nodes SET parent_id = NULL WHERE (id = 1)"
847
+
848
+ e = @c2.new(:id => 6677)
849
+ d.parent = e
850
+ d.values.should == {:id => 1, :parent_id => 6677}
851
+ $sqls.last.should == "UPDATE nodes SET parent_id = 6677 WHERE (id = 1)"
852
+ end
853
+ end
854
+
855
+ context "Model.one_to_many" do
856
+ setup do
857
+ MODEL_DB.reset
858
+
859
+ @c1 = Class.new(Sequel::Model(:attributes)) do
860
+ end
861
+
862
+ @c2 = Class.new(Sequel::Model(:nodes)) do
863
+ end
864
+ end
865
+
866
+ specify "should define a getter method" do
867
+ @c2.one_to_many :attributes, :from => @c1, :key => :node_id
868
+
869
+ n = @c2.new(:id => 1234)
870
+ a = n.attributes
871
+ a.should be_a_kind_of(Sequel::Dataset)
872
+ a.sql.should == 'SELECT * FROM attributes WHERE (node_id = 1234)'
873
+ end
874
+
875
+ specify "should support plain dataset in the from option" do
876
+ @c2.one_to_many :attributes, :from => MODEL_DB[:xyz], :key => :node_id
877
+
878
+ n = @c2.new(:id => 1234)
879
+ a = n.attributes
880
+ a.should be_a_kind_of(Sequel::Dataset)
881
+ a.sql.should == 'SELECT * FROM xyz WHERE (node_id = 1234)'
882
+ end
883
+
884
+ specify "should support table name in the from option" do
885
+ @c2.one_to_many :attributes, :from => :abc, :key => :node_id
886
+
887
+ n = @c2.new(:id => 1234)
888
+ a = n.attributes
889
+ a.should be_a_kind_of(Sequel::Dataset)
890
+ a.sql.should == 'SELECT * FROM abc WHERE (node_id = 1234)'
891
+ end
892
+ end
893
+
894
+ context "Model#pk" do
895
+ setup do
896
+ @m = Class.new(Sequel::Model)
897
+ end
898
+
899
+ specify "should be default return the value of the :id column" do
900
+ m = @m.new(:id => 111, :x => 2, :y => 3)
901
+ m.pk.should == 111
902
+ end
903
+
904
+ specify "should be return the primary key value for custom primary key" do
905
+ @m.set_primary_key :x
906
+ m = @m.new(:id => 111, :x => 2, :y => 3)
907
+ m.pk.should == 2
908
+ end
909
+
910
+ specify "should be return the primary key value for composite primary key" do
911
+ @m.set_primary_key [:y, :x]
912
+ m = @m.new(:id => 111, :x => 2, :y => 3)
913
+ m.pk.should == [3, 2]
914
+ end
915
+
916
+ specify "should raise if no primary key" do
917
+ @m.set_primary_key nil
918
+ m = @m.new(:id => 111, :x => 2, :y => 3)
919
+ proc {m.pk}.should raise_error(SequelError)
920
+
921
+ @m.no_primary_key
922
+ m = @m.new(:id => 111, :x => 2, :y => 3)
923
+ proc {m.pk}.should raise_error(SequelError)
924
+ end
925
+ end
926
+
927
+ context "Model#pk_hash" do
928
+ setup do
929
+ @m = Class.new(Sequel::Model)
930
+ end
931
+
932
+ specify "should be default return the value of the :id column" do
933
+ m = @m.new(:id => 111, :x => 2, :y => 3)
934
+ m.pk_hash.should == {:id => 111}
935
+ end
936
+
937
+ specify "should be return the primary key value for custom primary key" do
938
+ @m.set_primary_key :x
939
+ m = @m.new(:id => 111, :x => 2, :y => 3)
940
+ m.pk_hash.should == {:x => 2}
941
+ end
942
+
943
+ specify "should be return the primary key value for composite primary key" do
944
+ @m.set_primary_key [:y, :x]
945
+ m = @m.new(:id => 111, :x => 2, :y => 3)
946
+ m.pk_hash.should == {:y => 3, :x => 2}
947
+ end
948
+
949
+ specify "should raise if no primary key" do
950
+ @m.set_primary_key nil
951
+ m = @m.new(:id => 111, :x => 2, :y => 3)
952
+ proc {m.pk_hash}.should raise_error(SequelError)
953
+
954
+ @m.no_primary_key
955
+ m = @m.new(:id => 111, :x => 2, :y => 3)
956
+ proc {m.pk_hash}.should raise_error(SequelError)
957
+ end
958
+ end
959
+
960
+ context "A Model constructor" do
961
+ setup do
962
+ @m = Class.new(Sequel::Model)
963
+ end
964
+
965
+ specify "should accept a hash" do
966
+ m = @m.new(:a => 1, :b => 2)
967
+ m.values.should == {:a => 1, :b => 2}
968
+ m.should be_new
969
+ end
970
+
971
+ specify "should "
764
972
  end
data/spec/schema_spec.rb CHANGED
@@ -104,6 +104,19 @@ context "DB#create_table" do
104
104
  @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects);"]
105
105
  end
106
106
 
107
+ specify "should accept foreign keys with arbitrary keys" do
108
+ @db.create_table(:cats) do
109
+ foreign_key :project_id, :table => :projects, :key => :id
110
+ end
111
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects(id));"]
112
+
113
+ @db.sqls.clear
114
+ @db.create_table(:cats) do
115
+ foreign_key :project_id, :table => :projects, :key => :zzz
116
+ end
117
+ @db.sqls.should == ["CREATE TABLE cats (project_id integer REFERENCES projects(zzz));"]
118
+ end
119
+
107
120
  specify "should accept foreign keys with ON DELETE clause" do
108
121
  @db.create_table(:cats) do
109
122
  foreign_key :project_id, :table => :projects, :on_delete => :restrict