mutation_test.rb 4.7 KB
Newer Older
1
require 'cases/helper'
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
require 'models/post'

module ActiveRecord
  class RelationMutationTest < ActiveSupport::TestCase
    class FakeKlass < Struct.new(:table_name, :name)
      extend ActiveRecord::Delegation::DelegateCache
      inherited self

      def connection
        Post.connection
      end

      def relation_delegate_class(klass)
        self.class.relation_delegate_class(klass)
      end
17 18 19 20

      def attribute_alias?(name)
        false
      end
21 22 23 24

      def sanitize_sql(sql)
        sql
      end
25 26 27
    end

    def relation
28
      @relation ||= Relation.new FakeKlass.new('posts'), Post.arel_table, Post.predicate_builder
29 30
    end

31
    (Relation::MULTI_VALUE_METHODS - [:references, :extending, :order, :unscope, :select]).each do |method|
32 33 34 35 36 37
      test "##{method}!" do
        assert relation.public_send("#{method}!", :foo).equal?(relation)
        assert_equal [:foo], relation.public_send("#{method}_values")
      end
    end

38 39 40 41 42
    test "#_select!" do
      assert relation.public_send("_select!", :foo).equal?(relation)
      assert_equal [:foo], relation.public_send("select_values")
    end

43
    test '#order!' do
44 45 46 47
      assert relation.order!('name ASC').equal?(relation)
      assert_equal ['name ASC'], relation.order_values
    end

48
    test '#order! with symbol prepends the table name' do
49 50 51 52 53 54 55
      assert relation.order!(:name).equal?(relation)
      node = relation.order_values.first
      assert node.ascending?
      assert_equal :name, node.expr.name
      assert_equal "posts", node.expr.relation.name
    end

56
    test '#order! on non-string does not attempt regexp match for references' do
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
      obj = Object.new
      obj.expects(:=~).never
      assert relation.order!(obj)
      assert_equal [obj], relation.order_values
    end

    test '#references!' do
      assert relation.references!(:foo).equal?(relation)
      assert relation.references_values.include?('foo')
    end

    test 'extending!' do
      mod, mod2 = Module.new, Module.new

      assert relation.extending!(mod).equal?(relation)
      assert_equal [mod], relation.extending_values
      assert relation.is_a?(mod)

      relation.extending!(mod2)
      assert_equal [mod, mod2], relation.extending_values
    end

    test 'extending! with empty args' do
      relation.extending!
      assert_equal [], relation.extending_values
    end

    (Relation::SINGLE_VALUE_METHODS - [:from, :lock, :reordering, :reverse_order, :create_with]).each do |method|
      test "##{method}!" do
        assert relation.public_send("#{method}!", :foo).equal?(relation)
        assert_equal :foo, relation.public_send("#{method}_value")
      end
    end

    test '#from!' do
      assert relation.from!('foo').equal?(relation)
      assert_equal ['foo', nil], relation.from_value
    end

    test '#lock!' do
      assert relation.lock!('foo').equal?(relation)
      assert_equal 'foo', relation.lock_value
    end

    test '#reorder!' do
S
Sean Griffin 已提交
102
      @relation = self.relation.order('foo')
103 104 105 106 107 108

      assert relation.reorder!('bar').equal?(relation)
      assert_equal ['bar'], relation.order_values
      assert relation.reordering_value
    end

109 110 111 112 113 114 115 116 117
    test '#reorder! with symbol prepends the table name' do
      assert relation.reorder!(:name).equal?(relation)
      node = relation.order_values.first

      assert node.ascending?
      assert_equal :name, node.expr.name
      assert_equal "posts", node.expr.relation.name
    end

118
    test 'reverse_order!' do
S
Sean Griffin 已提交
119
      @relation = Post.order('title ASC, comments_count DESC')
120 121 122 123 124 125 126

      relation.reverse_order!

      assert_equal 'title DESC', relation.order_values.first
      assert_equal 'comments_count ASC', relation.order_values.last


127
      relation.reverse_order!
128 129 130

      assert_equal 'title ASC', relation.order_values.first
      assert_equal 'comments_count DESC', relation.order_values.last
131 132 133 134 135 136 137
    end

    test 'create_with!' do
      assert relation.create_with!(foo: 'bar').equal?(relation)
      assert_equal({foo: 'bar'}, relation.create_with_value)
    end

138
    test 'test_merge!' do
139 140
      assert relation.merge!(select: :foo).equal?(relation)
      assert_equal [:foo], relation.select_values
141 142 143
    end

    test 'merge with a proc' do
144
      assert_equal [:foo], relation.merge(-> { select(:foo) }).select_values
145 146 147 148 149 150 151 152
    end

    test 'none!' do
      assert relation.none!.equal?(relation)
      assert_equal [NullRelation], relation.extending_values
      assert relation.is_a?(NullRelation)
    end

153
    test 'distinct!' do
154 155 156 157 158
      relation.distinct! :foo
      assert_equal :foo, relation.distinct_value
      assert_equal :foo, relation.uniq_value # deprecated access
    end

159
    test 'uniq! was replaced by distinct!' do
160 161 162 163 164 165
      relation.uniq! :foo
      assert_equal :foo, relation.distinct_value
      assert_equal :foo, relation.uniq_value # deprecated access
    end
  end
end