5
5
require 'active_support/core_ext/string'
6
6
7
7
describe AnnotateModels do
8
- def mock_index ( name , columns = [ ] , orders = { } , unique = false )
8
+ def mock_index ( name , params = { } )
9
9
double ( 'IndexKeyDefinition' ,
10
10
name : name ,
11
- columns : columns ,
12
- unique : unique ,
13
- orders : orders )
11
+ columns : params [ :columns ] || [ ] ,
12
+ unique : params [ :unique ] || false ,
13
+ orders : params [ :orders ] || { } ,
14
+ where : params [ :where ] ,
15
+ using : params [ :using ] )
14
16
end
15
17
16
18
def mock_foreign_key ( name , from_column , to_table , to_column = 'id' , constraints = { } )
@@ -303,8 +305,8 @@ def mock_column(name, type, options = {})
303
305
[
304
306
mock_column ( :id , :integer ) ,
305
307
mock_column ( :foreign_thing_id , :integer )
306
- ] , [ mock_index ( 'index_rails_02e851e3b7' , [ 'id' ] ) ,
307
- mock_index ( 'index_rails_02e851e3b8' , [ 'foreign_thing_id' ] ) ] )
308
+ ] , [ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
309
+ mock_index ( 'index_rails_02e851e3b8' , columns : [ 'foreign_thing_id' ] ) ] )
308
310
expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , show_indexes : true ) ) . to eql ( <<-EOS )
309
311
# Schema Info
310
312
#
@@ -331,10 +333,10 @@ def mock_column(name, type, options = {})
331
333
mock_column ( "value" , :string )
332
334
] ,
333
335
[
334
- mock_index ( 'index_rails_02e851e3b7' , [ 'id' ] ) ,
336
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
335
337
mock_index ( 'index_rails_02e851e3b8' ,
336
- %w( firstname surname value ) ,
337
- 'surname' => :asc , 'value' => :desc )
338
+ columns : %w( firstname surname value ) ,
339
+ orders : { 'surname' => :asc , 'value' => :desc } )
338
340
] )
339
341
expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , show_indexes : true ) ) . to eql ( <<-EOS )
340
342
# Schema Info
@@ -354,6 +356,72 @@ def mock_column(name, type, options = {})
354
356
EOS
355
357
end
356
358
359
+ it 'should get indexes keys with where clause' do
360
+ klass = mock_class ( :users ,
361
+ :id ,
362
+ [
363
+ mock_column ( "id" , :integer ) ,
364
+ mock_column ( "firstname" , :string ) ,
365
+ mock_column ( "surname" , :string ) ,
366
+ mock_column ( "value" , :string )
367
+ ] ,
368
+ [
369
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
370
+ mock_index ( 'index_rails_02e851e3b8' ,
371
+ columns : %w( firstname surname ) ,
372
+ where : 'value IS NOT NULL' )
373
+ ] )
374
+ expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , show_indexes : true ) ) . to eql ( <<-EOS )
375
+ # Schema Info
376
+ #
377
+ # Table name: users
378
+ #
379
+ # id :integer not null, primary key
380
+ # firstname :string not null
381
+ # surname :string not null
382
+ # value :string not null
383
+ #
384
+ # Indexes
385
+ #
386
+ # index_rails_02e851e3b7 (id)
387
+ # index_rails_02e851e3b8 (firstname,surname) WHERE value IS NOT NULL
388
+ #
389
+ EOS
390
+ end
391
+
392
+ it 'should get indexes keys with using clause other than btree' do
393
+ klass = mock_class ( :users ,
394
+ :id ,
395
+ [
396
+ mock_column ( "id" , :integer ) ,
397
+ mock_column ( "firstname" , :string ) ,
398
+ mock_column ( "surname" , :string ) ,
399
+ mock_column ( "value" , :string )
400
+ ] ,
401
+ [
402
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
403
+ mock_index ( 'index_rails_02e851e3b8' ,
404
+ columns : %w( firstname surname ) ,
405
+ using : 'hash' )
406
+ ] )
407
+ expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , show_indexes : true ) ) . to eql ( <<-EOS )
408
+ # Schema Info
409
+ #
410
+ # Table name: users
411
+ #
412
+ # id :integer not null, primary key
413
+ # firstname :string not null
414
+ # surname :string not null
415
+ # value :string not null
416
+ #
417
+ # Indexes
418
+ #
419
+ # index_rails_02e851e3b7 (id)
420
+ # index_rails_02e851e3b8 (firstname,surname) USING hash
421
+ #
422
+ EOS
423
+ end
424
+
357
425
it 'should get simple indexes keys' do
358
426
klass = mock_class ( :users ,
359
427
:id ,
@@ -362,10 +430,10 @@ def mock_column(name, type, options = {})
362
430
mock_column ( :foreign_thing_id , :integer )
363
431
] ,
364
432
[
365
- mock_index ( 'index_rails_02e851e3b7' , [ 'id' ] ) ,
433
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
366
434
mock_index ( 'index_rails_02e851e3b8' ,
367
- [ 'foreign_thing_id' ] ,
368
- 'foreign_thing_id' => :desc )
435
+ columns : [ 'foreign_thing_id' ] ,
436
+ orders : { 'foreign_thing_id' => :desc } )
369
437
] )
370
438
expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , simple_indexes : true ) ) . to eql ( <<-EOS )
371
439
# Schema Info
@@ -384,8 +452,8 @@ def mock_column(name, type, options = {})
384
452
[
385
453
mock_column ( "id" , :integer ) ,
386
454
mock_column ( "name" , :string )
387
- ] , [ mock_index ( 'index_rails_02e851e3b7' , [ 'id' ] ) ,
388
- mock_index ( 'index_rails_02e851e3b8' , 'LOWER(name)' ) ] )
455
+ ] , [ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
456
+ mock_index ( 'index_rails_02e851e3b8' , columns : 'LOWER(name)' ) ] )
389
457
expect ( AnnotateModels . get_schema_info ( klass , 'Schema Info' , simple_indexes : true ) ) . to eql ( <<-EOS )
390
458
# Schema Info
391
459
#
@@ -501,10 +569,79 @@ def mock_column(name, type, options = {})
501
569
mock_column ( :name , :string , limit : 50 )
502
570
] ,
503
571
[
504
- mock_index ( 'index_rails_02e851e3b7' , [ 'id' ] ) ,
572
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
505
573
mock_index ( 'index_rails_02e851e3b8' ,
506
- [ 'foreign_thing_id' ] ,
507
- 'foreign_thing_id' => :desc )
574
+ columns : [ 'foreign_thing_id' ] )
575
+ ] )
576
+ expect ( AnnotateModels . get_schema_info ( klass , AnnotateModels ::PREFIX , format_markdown : true , show_indexes : true ) ) . to eql ( <<-EOS )
577
+ # #{ AnnotateModels ::PREFIX }
578
+ #
579
+ # Table name: `users`
580
+ #
581
+ # ### Columns
582
+ #
583
+ # Name | Type | Attributes
584
+ # ----------- | ------------------ | ---------------------------
585
+ # **`id`** | `integer` | `not null, primary key`
586
+ # **`name`** | `string(50)` | `not null`
587
+ #
588
+ # ### Indexes
589
+ #
590
+ # * `index_rails_02e851e3b7`:
591
+ # * **`id`**
592
+ # * `index_rails_02e851e3b8`:
593
+ # * **`foreign_thing_id`**
594
+ #
595
+ EOS
596
+ end
597
+
598
+ it 'should get schema info as Markdown with unique indexes' do
599
+ klass = mock_class ( :users ,
600
+ :id ,
601
+ [
602
+ mock_column ( :id , :integer ) ,
603
+ mock_column ( :name , :string , limit : 50 )
604
+ ] ,
605
+ [
606
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
607
+ mock_index ( 'index_rails_02e851e3b8' ,
608
+ columns : [ 'foreign_thing_id' ] ,
609
+ unique : true )
610
+ ] )
611
+ expect ( AnnotateModels . get_schema_info ( klass , AnnotateModels ::PREFIX , format_markdown : true , show_indexes : true ) ) . to eql ( <<-EOS )
612
+ # #{ AnnotateModels ::PREFIX }
613
+ #
614
+ # Table name: `users`
615
+ #
616
+ # ### Columns
617
+ #
618
+ # Name | Type | Attributes
619
+ # ----------- | ------------------ | ---------------------------
620
+ # **`id`** | `integer` | `not null, primary key`
621
+ # **`name`** | `string(50)` | `not null`
622
+ #
623
+ # ### Indexes
624
+ #
625
+ # * `index_rails_02e851e3b7`:
626
+ # * **`id`**
627
+ # * `index_rails_02e851e3b8` (_unique_):
628
+ # * **`foreign_thing_id`**
629
+ #
630
+ EOS
631
+ end
632
+
633
+ it 'should get schema info as Markdown with ordered indexes' do
634
+ klass = mock_class ( :users ,
635
+ :id ,
636
+ [
637
+ mock_column ( :id , :integer ) ,
638
+ mock_column ( :name , :string , limit : 50 )
639
+ ] ,
640
+ [
641
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
642
+ mock_index ( 'index_rails_02e851e3b8' ,
643
+ columns : [ 'foreign_thing_id' ] ,
644
+ orders : { 'foreign_thing_id' => :desc } )
508
645
] )
509
646
expect ( AnnotateModels . get_schema_info ( klass , AnnotateModels ::PREFIX , format_markdown : true , show_indexes : true ) ) . to eql ( <<-EOS )
510
647
# #{ AnnotateModels ::PREFIX }
@@ -528,6 +665,77 @@ def mock_column(name, type, options = {})
528
665
EOS
529
666
end
530
667
668
+ it 'should get schema info as Markdown with indexes with WHERE clause' do
669
+ klass = mock_class ( :users ,
670
+ :id ,
671
+ [
672
+ mock_column ( :id , :integer ) ,
673
+ mock_column ( :name , :string , limit : 50 )
674
+ ] ,
675
+ [
676
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
677
+ mock_index ( 'index_rails_02e851e3b8' ,
678
+ columns : [ 'foreign_thing_id' ] ,
679
+ unique : true ,
680
+ where : 'name IS NOT NULL' )
681
+ ] )
682
+ expect ( AnnotateModels . get_schema_info ( klass , AnnotateModels ::PREFIX , format_markdown : true , show_indexes : true ) ) . to eql ( <<-EOS )
683
+ # #{ AnnotateModels ::PREFIX }
684
+ #
685
+ # Table name: `users`
686
+ #
687
+ # ### Columns
688
+ #
689
+ # Name | Type | Attributes
690
+ # ----------- | ------------------ | ---------------------------
691
+ # **`id`** | `integer` | `not null, primary key`
692
+ # **`name`** | `string(50)` | `not null`
693
+ #
694
+ # ### Indexes
695
+ #
696
+ # * `index_rails_02e851e3b7`:
697
+ # * **`id`**
698
+ # * `index_rails_02e851e3b8` (_unique_ _where_ name IS NOT NULL):
699
+ # * **`foreign_thing_id`**
700
+ #
701
+ EOS
702
+ end
703
+
704
+ it 'should get schema info as Markdown with indexes with using clause other than btree' do
705
+ klass = mock_class ( :users ,
706
+ :id ,
707
+ [
708
+ mock_column ( :id , :integer ) ,
709
+ mock_column ( :name , :string , limit : 50 )
710
+ ] ,
711
+ [
712
+ mock_index ( 'index_rails_02e851e3b7' , columns : [ 'id' ] ) ,
713
+ mock_index ( 'index_rails_02e851e3b8' ,
714
+ columns : [ 'foreign_thing_id' ] ,
715
+ using : 'hash' )
716
+ ] )
717
+ expect ( AnnotateModels . get_schema_info ( klass , AnnotateModels ::PREFIX , format_markdown : true , show_indexes : true ) ) . to eql ( <<-EOS )
718
+ # #{ AnnotateModels ::PREFIX }
719
+ #
720
+ # Table name: `users`
721
+ #
722
+ # ### Columns
723
+ #
724
+ # Name | Type | Attributes
725
+ # ----------- | ------------------ | ---------------------------
726
+ # **`id`** | `integer` | `not null, primary key`
727
+ # **`name`** | `string(50)` | `not null`
728
+ #
729
+ # ### Indexes
730
+ #
731
+ # * `index_rails_02e851e3b7`:
732
+ # * **`id`**
733
+ # * `index_rails_02e851e3b8` (_using_ hash):
734
+ # * **`foreign_thing_id`**
735
+ #
736
+ EOS
737
+ end
738
+
531
739
describe '#set_defaults' do
532
740
it 'should default show_complete_foreign_keys to false' do
533
741
expect ( Annotate . true? ( ENV [ 'show_complete_foreign_keys' ] ) ) . to be ( false )
0 commit comments