summaryrefslogtreecommitdiff
path: root/qa/spec/page/element_spec.rb
blob: fbf58b5e18a48f20ef42c724d8815a41ee4c6c76 (plain)
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
136
137
138
139
# frozen_string_literal: true

RSpec.describe QA::Page::Element do
  describe '#selector' do
    it 'transforms element name into QA-specific selector' do
      expect(described_class.new(:sign_in_button).selector)
        .to eq 'qa-sign-in-button'
    end
  end

  describe '#selector_css' do
    it 'transforms element name into QA-specific clickable css selector' do
      expect(described_class.new(:sign_in_button).selector_css)
        .to include('.qa-sign-in-button')
    end
  end

  context 'when pattern is an expression' do
    subject { described_class.new(:something, /button 'Sign in'/) }

    it 'matches when there is a match' do
      expect(subject.matches?("button 'Sign in'")).to be true
    end

    it 'does not match if pattern is not present' do
      expect(subject.matches?("button 'Sign out'")).to be false
    end
  end

  context 'when pattern is a string' do
    subject { described_class.new(:something, 'button') }

    it 'matches when there is match' do
      expect(subject.matches?('some button in the view')).to be true
    end

    it 'does not match if pattern is not present' do
      expect(subject.matches?('text_field :name')).to be false
    end
  end

  context 'when pattern is not provided' do
    subject { described_class.new(:some_name) }

    it 'matches when QA specific selector is present' do
      expect(subject.matches?('some qa-some-name selector')).to be true
    end

    it 'does not match if QA selector is not there' do
      expect(subject.matches?('some_name selector')).to be false
    end

    it 'matches when element name is specified' do
      expect(subject.matches?('data:{qa:{selector:"some_name"}}')).to be true
    end
  end

  describe 'attributes' do
    context 'element with no args' do
      subject { described_class.new(:something) }

      it 'defaults pattern to #selector' do
        expect(subject.attributes[:pattern]).to eq 'qa-something'
        expect(subject.attributes[:pattern]).to eq subject.selector
      end

      it 'is not required by default' do
        expect(subject.required?).to be false
      end
    end

    context 'element with a pattern' do
      subject { described_class.new(:something, /link_to 'something'/) }

      it 'has an attribute[pattern] of the pattern' do
        expect(subject.attributes[:pattern]).to eq /link_to 'something'/
      end

      it 'is not required by default' do
        expect(subject.required?).to be false
      end
    end

    context 'element with requirement; no pattern' do
      subject { described_class.new(:something, required: true) }

      it 'has an attribute[pattern] of the selector' do
        expect(subject.attributes[:pattern]).to eq 'qa-something'
        expect(subject.attributes[:pattern]).to eq subject.selector
      end

      it 'is required' do
        expect(subject.required?).to be true
      end
    end

    context 'element with requirement and pattern' do
      subject { described_class.new(:something, /link_to 'something_else_entirely'/, required: true) }

      it 'has an attribute[pattern] of the passed pattern' do
        expect(subject.attributes[:pattern]).to eq /link_to 'something_else_entirely'/
      end

      it 'is required' do
        expect(subject.required?).to be true
      end

      it 'has a selector of the name' do
        expect(subject.selector).to eq 'qa-something'
      end
    end
  end

  describe 'data-qa selectors' do
    subject { described_class.new(:my_element) }

    it 'properly translates to a data-qa-selector' do
      expect(subject.selector_css).to include(%q([data-qa-selector="my_element"]))
    end

    context 'additional selectors' do
      let(:element) { described_class.new(:my_element, index: 3, another_match: 'something') }
      let(:required_element) { described_class.new(:my_element, required: true, index: 3) }

      it 'matches on additional data-qa properties' do
        expect(element.selector_css).to include(%q([data-qa-selector="my_element"][data-qa-index="3"]))
      end

      it 'doesnt conflict with element requirement' do
        expect(required_element).to be_required
        expect(required_element.selector_css).not_to include(%q(data-qa-required))
      end

      it 'translates snake_case to kebab-case' do
        expect(element.selector_css).to include(%q(data-qa-another-match))
      end
    end
  end
end