summaryrefslogtreecommitdiff
path: root/spec/javascripts/behaviors/quick_submit_spec.js.coffee
blob: 09708c12ed43b535c4f1d91dfb212a4461cdc93b (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
#= require behaviors/quick_submit

describe 'Quick Submit behavior', ->
  fixture.preload('behaviors/quick_submit.html')

  beforeEach ->
    fixture.load('behaviors/quick_submit.html')

    # Prevent a form submit from moving us off the testing page
    $('form').submit (e) -> e.preventDefault()

    @spies = {
      submit: spyOnEvent('form', 'submit')
    }

  it 'does not respond to other keyCodes', ->
    $('input').trigger(keydownEvent(keyCode: 32))

    expect(@spies.submit).not.toHaveBeenTriggered()

  it 'does not respond to Enter alone', ->
    $('input').trigger(keydownEvent(ctrlKey: false, metaKey: false))

    expect(@spies.submit).not.toHaveBeenTriggered()

  it 'does not respond to repeated events', ->
    $('input').trigger(keydownEvent(repeat: true))

    expect(@spies.submit).not.toHaveBeenTriggered()

  it 'disables submit buttons', ->
    $('textarea').trigger(keydownEvent())

    expect($('input[type=submit]')).toBeDisabled()
    expect($('button[type=submit]')).toBeDisabled()

  # We cannot stub `navigator.userAgent` for CI's `rake teaspoon` task, so we'll
  # only run the tests that apply to the current platform
  if navigator.userAgent.match(/Macintosh/)
    it 'responds to Meta+Enter', ->
      $('input').trigger(keydownEvent())

      expect(@spies.submit).toHaveBeenTriggered()

    it 'excludes other modifier keys', ->
      $('input').trigger(keydownEvent(altKey: true))
      $('input').trigger(keydownEvent(ctrlKey: true))
      $('input').trigger(keydownEvent(shiftKey: true))

      expect(@spies.submit).not.toHaveBeenTriggered()
  else
    it 'responds to Ctrl+Enter', ->
      $('input').trigger(keydownEvent())

      expect(@spies.submit).toHaveBeenTriggered()

    it 'excludes other modifier keys', ->
      $('input').trigger(keydownEvent(altKey: true))
      $('input').trigger(keydownEvent(metaKey: true))
      $('input').trigger(keydownEvent(shiftKey: true))

      expect(@spies.submit).not.toHaveBeenTriggered()

  keydownEvent = (options) ->
    if navigator.userAgent.match(/Macintosh/)
      defaults = { keyCode: 13, metaKey: true }
    else
      defaults = { keyCode: 13, ctrlKey: true }

    $.Event('keydown', $.extend({}, defaults, options))