File: has_entry_test.rb

package info (click to toggle)
ruby-mocha 3.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,652 kB
  • sloc: ruby: 12,324; javascript: 499; makefile: 14
file content (135 lines) | stat: -rw-r--r-- 4,850 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# frozen_string_literal: true

require File.expand_path('../../../test_helper', __FILE__)

require 'mocha/parameter_matchers/has_entry'
require 'mocha/parameter_matchers/instance_methods'
require 'mocha/parameter_matchers/equals'
require 'mocha/inspect'

class HasEntryTest < Mocha::TestCase
  include Mocha::ParameterMatchers::Methods

  def test_should_match_hash_including_specified_key_value_pair
    matcher = has_entry(:key_1, 'value_1')
    assert matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_not_match_hash_not_including_specified_key_value_pair
    matcher = has_entry(:key_1, 'value_2')
    assert !matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_match_hash_including_specified_entry
    matcher = has_entry(key_1: 'value_1')
    assert matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_not_match_hash_not_including_specified_entry
    matcher = has_entry(key_1: 'value_2')
    assert !matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_describe_matcher_with_key_value_pair
    matcher = has_entry(:key_1, 'value_1')
    assert_equal %{has_entry(:key_1 => "value_1")}, matcher.mocha_inspect
  end

  def test_should_describe_matcher_with_entry
    matcher = has_entry(key_1: 'value_1')
    assert_equal %{has_entry(:key_1 => "value_1")}, matcher.mocha_inspect
  end

  def test_should_match_hash_including_specified_entry_with_nested_key_matcher
    matcher = has_entry(equals(:key_1) => 'value_1')
    assert matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_match_hash_including_specified_entry_with_nested_value_matcher
    matcher = has_entry(key_1: equals('value_1'))
    assert matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_not_match_hash_not_including_specified_entry_with_nested_key_matcher
    matcher = has_entry(equals(:key_1) => 'value_2')
    assert !matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_not_match_hash_not_including_specified_entry_with_nested_value_matcher
    matcher = has_entry(key_1: equals('value_2'))
    assert !matcher.matches?([{ key_1: 'value_1', key_2: 'value_2' }])
  end

  def test_should_not_match_object_that_doesnt_respond_to_keys
    matcher = has_entry(key_1: equals('value_2'))
    object = Class.new do
      def [](_key)
        'value_2'
      end
    end.new
    assert !matcher.matches?([object])
  end

  def test_should_not_match_object_that_doesnt_respond_to_square_bracket
    matcher = has_entry(key_1: equals('value_2'))
    object = Class.new do
      def keys
        [:key_1]
      end
    end.new
    assert !matcher.matches?([object])
  end

  def test_should_raise_argument_error_if_single_argument_is_not_a_hash
    e = assert_raises(ArgumentError) do
      has_entry([])
    end
    assert_equal 'Argument is not a Hash.', e.message
  end

  def test_should_raise_argument_error_if_no_entries_are_supplied
    e = assert_raises(ArgumentError) do
      has_entry({})
    end
    assert_equal 'Argument has no entries.', e.message
  end

  def test_should_raise_argument_error_if_no_arguments_are_supplied
    e = assert_raises(ArgumentError) { has_entry }
    assert_equal 'No arguments. Expecting at least one.', e.message
  end

  def test_should_raise_argument_error_if_multiple_entries_are_supplied
    e = assert_raises(ArgumentError) do
      has_entry(key_1: 'value_1', key_2: 'value_2')
    end
    assert_equal 'Argument has multiple entries. Use Mocha::ParameterMatchers#has_entries instead.', e.message
  end

  def test_should_raise_argument_error_if_more_than_two_arguments_are_supplied
    e = assert_raises(ArgumentError) do
      has_entry(1, 2, 3)
    end
    assert_equal 'Too many arguments; use either a single argument (must be a Hash) or two arguments (a key and a value).', e.message
  end

  def test_should_match_array_as_key
    matcher = has_entry([:key_1, :key_2] => 'value_1')
    assert matcher.matches?([{ [:key_1, :key_2] => 'value_1', key_3: 'value_2' }])
  end

  def test_should_match_array_as_value
    matcher = has_entry(key_1: %w[value_1 value_2])
    assert matcher.matches?([{ key_1: %w[value_1 value_2] }])
  end

  def test_should_match_hash_as_value_and_key
    matcher = has_entry({ key_1: 'value_1', key_2: 'value_2' } => { key_3: 'value_3', key_4: 'value_4' })
    assert matcher.matches?([{ { key_1: 'value_1', key_2: 'value_2' } => { key_3: 'value_3', key_4: 'value_4' }, key_5: 'value_5' }])
  end

  def test_should_match_matcher_as_value_and_key
    matcher = has_entry(has_entry(key_1: 'value_1') => has_entry(key_3: 'value_3'))
    assert matcher.matches?([{ { key_1: 'value_1', key_2: 'value_2' } => { key_3: 'value_3', key_4: 'value_4' }, key_5: 'value_5' }])
  end
end