flights_gui_henry_tests 1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +3 -0
  3. data/features/data/home-offers-config.csv +883 -0
  4. data/features/data/host.yml +72 -0
  5. data/features/data/miles.yml +216 -0
  6. data/features/data/search.yml +27 -0
  7. data/features/data/sites.yml +39 -0
  8. data/features/data/tag_microsoft.yml +68 -0
  9. data/features/step_definitions/checkout/agencia_steps.rb +6 -0
  10. data/features/step_definitions/checkout/chat_steps.rb +43 -0
  11. data/features/step_definitions/checkout/checkout_steps.rb +144 -0
  12. data/features/step_definitions/checkout/cupones_steps.rb +26 -0
  13. data/features/step_definitions/checkout/error_messages.rb +251 -0
  14. data/features/step_definitions/checkout/seguros_steps.rb +78 -0
  15. data/features/step_definitions/checkout/thanks_steps.rb +75 -0
  16. data/features/step_definitions/content/contents_steps.rb +140 -0
  17. data/features/step_definitions/desambiguation/disambiguation_airports_steps.rb +73 -0
  18. data/features/step_definitions/desambiguation/disambiguation_city_steps.rb +43 -0
  19. data/features/step_definitions/filter/filters_airlines.rb +38 -0
  20. data/features/step_definitions/filter/filters_airports_steps.rb +31 -0
  21. data/features/step_definitions/filter/filters_price_steps.rb +87 -0
  22. data/features/step_definitions/filter/filters_stops_steps.rb +44 -0
  23. data/features/step_definitions/filter/filters_time_steps.rb +143 -0
  24. data/features/step_definitions/filter/matrix_steps.rb +249 -0
  25. data/features/step_definitions/landing/landing_checkout_steps.rb +45 -0
  26. data/features/step_definitions/landing/landing_filters_steps.rb +17 -0
  27. data/features/step_definitions/landing/landing_home_alerts_steps.rb +21 -0
  28. data/features/step_definitions/landing/landing_home_steps.rb +82 -0
  29. data/features/step_definitions/landing/landing_long_tail.rb +58 -0
  30. data/features/step_definitions/landing/landing_negative_steps.rb +127 -0
  31. data/features/step_definitions/landing/landing_passenger_review_steps.rb +8 -0
  32. data/features/step_definitions/landing/landing_steps.rb +325 -0
  33. data/features/step_definitions/orders/orders.rb +67 -0
  34. data/features/step_definitions/others/advancedgui_steps.rb +28 -0
  35. data/features/step_definitions/others/advancednogui_steps.rb +34 -0
  36. data/features/step_definitions/others/anticipatedsearch_steps.rb +13 -0
  37. data/features/step_definitions/others/flights_tracker_steps.rb +73 -0
  38. data/features/step_definitions/others/generic_steps.rb +35 -0
  39. data/features/step_definitions/others/newsletter_steps.rb +50 -0
  40. data/features/step_definitions/others/one_day_search.rb +58 -0
  41. data/features/step_definitions/others/print_steps.rb +26 -0
  42. data/features/step_definitions/others/querystringparameters_steps.rb +6 -0
  43. data/features/step_definitions/others/recommendation_steps.rb +80 -0
  44. data/features/step_definitions/others/render_steps.rb +70 -0
  45. data/features/step_definitions/others/tag_steps.rb +157 -0
  46. data/features/step_definitions/others/upgrade_bussines_steps.rb +27 -0
  47. data/features/step_definitions/results/load_steps.rb +69 -0
  48. data/features/step_definitions/results/results_steps.rb +21 -0
  49. data/features/step_definitions/results/search_steps.rb +82 -0
  50. data/features/step_definitions/search/alerts_steps.rb +132 -0
  51. data/features/step_definitions/search/basefare_steps.rb +64 -0
  52. data/features/step_definitions/search/bestprices_steps.rb +70 -0
  53. data/features/step_definitions/search/cross_sell_row_hoteles.rb +78 -0
  54. data/features/step_definitions/search/cross_sell_steps.rb +15 -0
  55. data/features/step_definitions/search/delays_steps.rb +67 -0
  56. data/features/step_definitions/search/details_steps.rb +9 -0
  57. data/features/step_definitions/search/ecoflights_steps.rb +9 -0
  58. data/features/step_definitions/search/fenix_steps.rb +119 -0
  59. data/features/step_definitions/search/flight_gui_steps.rb +312 -0
  60. data/features/step_definitions/search/miles_step.rb +13 -0
  61. data/features/step_definitions/search/pagination_steps.rb +41 -0
  62. data/features/step_definitions/search/reviews_step.rb +56 -0
  63. data/features/step_definitions/search/search_no_gui_steps.rb +185 -0
  64. data/features/step_definitions/search/wish_list_steps.rb +123 -0
  65. data/features/support/env.rb +61 -0
  66. data/features/support/lib/clusters/data/datos_new.rb +33 -0
  67. data/features/support/lib/clusters/details/details_cluster.rb +30 -0
  68. data/features/support/lib/clusters/results/landing_cluster.rb +29 -0
  69. data/features/support/lib/clusters/results/render_cluster.rb +43 -0
  70. data/features/support/lib/clusters/results_cluster.rb +140 -0
  71. data/features/support/lib/clusters.rb +5 -0
  72. data/features/support/lib/helpers/browser.rb +212 -0
  73. data/features/support/lib/helpers/checkout.rb +31 -0
  74. data/features/support/lib/helpers/clusters.rb +234 -0
  75. data/features/support/lib/helpers/landing.rb +117 -0
  76. data/features/support/lib/helpers/render.rb +135 -0
  77. data/features/support/lib/helpers.rb +5 -0
  78. data/features/support/lib/price.rb +66 -0
  79. data/features/support/lib/services/fenix.rb +14 -0
  80. data/features/support/lib/services/landing.rb +18 -0
  81. data/features/support/lib/services/results.rb +62 -0
  82. data/features/support/lib/services.rb +4 -0
  83. data/features/support/matchers.rb +120 -0
  84. data/features/support/redefinitions.rb +42 -0
  85. data/features/tests/checkout/agency.feature +33 -0
  86. data/features/tests/checkout/button_cac.feature +52 -0
  87. data/features/tests/checkout/chat.feature +20 -0
  88. data/features/tests/checkout/cupones.feature +54 -0
  89. data/features/tests/checkout/error_messages.feature +64 -0
  90. data/features/tests/checkout/integration.feature +215 -0
  91. data/features/tests/checkout/low_cost.feature +55 -0
  92. data/features/tests/checkout/seguros.feature +37 -0
  93. data/features/tests/contents/costs.feature +29 -0
  94. data/features/tests/contents/rules.feature +58 -0
  95. data/features/tests/contents/webcheckin.feature +26 -0
  96. data/features/tests/desambiguation/airports.feature +89 -0
  97. data/features/tests/desambiguation/city.feature +86 -0
  98. data/features/tests/filters/filters.feature +160 -0
  99. data/features/tests/fixes/advancedgui.feature +171 -0
  100. data/features/tests/fixes/advancednogui.feature +60 -0
  101. data/features/tests/fixes/book_no_gui.feature +21 -0
  102. data/features/tests/fixes/cross_sell_row_hoteles.feature +70 -0
  103. data/features/tests/fixes/facebook.feature +31 -0
  104. data/features/tests/fixes/landing_home_alerts.feature +82 -0
  105. data/features/tests/fixes/matrix_stops.feature +104 -0
  106. data/features/tests/fixes/one_day_search.feature +63 -0
  107. data/features/tests/fixes/print.feature +87 -0
  108. data/features/tests/fixes/searches_no_gui.feature +85 -0
  109. data/features/tests/landing/landing_alerts.feature +93 -0
  110. data/features/tests/landing/landing_checkout.feature +286 -0
  111. data/features/tests/landing/landing_filters.feature +176 -0
  112. data/features/tests/landing/landing_home.feature +68 -0
  113. data/features/tests/landing/landing_integration.feature +153 -0
  114. data/features/tests/landing/landing_long_tail.feature +162 -0
  115. data/features/tests/landing/landing_matrix.feature +156 -0
  116. data/features/tests/landing/landing_negative.feature +157 -0
  117. data/features/tests/landing/landing_orders.feature +107 -0
  118. data/features/tests/landing/landing_pagination.feature +142 -0
  119. data/features/tests/landing/landing_passenger_review.feature +139 -0
  120. data/features/tests/landing/landing_positive.feature +155 -0
  121. data/features/tests/landing/landing_reviews.feature +139 -0
  122. data/features/tests/landing/landing_tags.feature +148 -0
  123. data/features/tests/matrix/matrix_airlines.feature +104 -0
  124. data/features/tests/matrix/matrix_fare_chart.feature +24 -0
  125. data/features/tests/matrix/matrix_price.feature +35 -0
  126. data/features/tests/others/alerts.feature +89 -0
  127. data/features/tests/others/anticipatedsearch.feature +82 -0
  128. data/features/tests/others/flights_tracker.feature +94 -0
  129. data/features/tests/others/newsletter.feature +131 -0
  130. data/features/tests/others/querystringparameters.feature +82 -0
  131. data/features/tests/others/recommendation.feature +170 -0
  132. data/features/tests/others/semaphore.feature +206 -0
  133. data/features/tests/others/upgrade_bussines.feature +100 -0
  134. data/features/tests/search/basefare.feature +88 -0
  135. data/features/tests/search/itineraries.feature +85 -0
  136. data/features/tests/search/orders.feature +100 -0
  137. data/features/tests/search/pagination.feature +70 -0
  138. data/features/tests/search/reviews.feature +84 -0
  139. data/features/tests/search/searches.feature +197 -0
  140. data/features/tests/search/wish_list.feature +102 -0
  141. data/flights_gui_henry_tests.gemspec +32 -0
  142. data/henry-context.yml +14733 -0
  143. metadata +324 -0
@@ -0,0 +1,135 @@
1
+ # -*- encoding : utf-8 -*-
2
+ #validaciones js and css de shop flights
3
+ def get_render(url,type)
4
+ begin
5
+ get = HTTParty.get("#{url}#{type}")
6
+ rescue
7
+ true.should be_true
8
+ end
9
+ return get
10
+ end
11
+ def validate_render(url,type)
12
+ data = get_render(url,type)
13
+ if data.code == 200
14
+ respond = Hpricot.parse(data.body)
15
+ respond.inner_text.should_not match("FreeMarker template error!")
16
+ else
17
+ true.should be_true
18
+ end
19
+ end
20
+ def escala_to_i(escala)
21
+ return 0 if escala.to_s =~ /(solo vuelo directo)|(Sin escalas)|(Sem escalas)|(Soamente v.o directo)|(Vuelo Directo)/i
22
+ return escala.to_s.gsub(/\D/,'').to_i
23
+ end
24
+ def validar_fechas(ticket,search)
25
+ if search.type.downcase !~ /multiple/
26
+ (ticket.ida.fecha == search.date_from).should be_true
27
+ if search.type.downcase =~ /roundtrip/
28
+ (ticket.vuelta.fecha == search.date_to).should be_true
29
+ end
30
+ else
31
+ (search.dates.split(',').include?(ticket.ida.fecha.to_s)).should be_true
32
+ (search.dates.split(',').include?(ticket.vuelta.fecha.to_s)).should be_true
33
+ end
34
+ end
35
+ #redefinicion del metodo que valida las ciudades en cada cluster
36
+ #se agrega la validacion del nombre de las ciudades origen/destino
37
+ def validar_destinos(ticket,search,html)
38
+ if search.type !~ /multipledestinations/
39
+ ((!search.from_city.airports.include?(ticket.ida.origen_iata))and(!search.to_city.airports.include?(ticket.ida.destino_iata))).should_not be_true
40
+ if search.type == 'roundtrip'
41
+ ((!search.to_city.airports.include?(ticket.vuelta.origen_iata))and(!search.from_city.airports.include?(ticket.vuelta.destino_iata))).should_not be_true
42
+ end
43
+ else
44
+ i = 0
45
+ (html/"div.sub-cluster.multiple").each do |tramo|
46
+ #(tramo/"li.city-departure").inner_text.gsub(/,/,'').strip.downcase.no_accents.downcase.should match("#{@search.from_cities[i].name}")
47
+ i += 1
48
+ end
49
+ end
50
+ end
51
+ #validar que el boton de seleccionar sea correcto
52
+ def validar_button(doc)
53
+ ((doc/"a[@class='buy btn-buy flights-button']/span").empty? or !(doc/"a[@class='buy btn-buy flights-button']/span").inner_text.strip.downcase.match(/seleccionar|selecionar/)).should_not be_true
54
+ end
55
+ def other_page(page)
56
+ if BROWSER.li(:class => "page", :index => page).present? or BROWSER.li(:class,'next enabled').present?
57
+ if BROWSER.li(:class,'next enabled').present?
58
+ BROWSER.li(:class,'next enabled').click
59
+ else
60
+ BROWSER.li(:class => "page", :index => page).click
61
+ end
62
+ wait_action()
63
+ return nil
64
+ else
65
+ BROWSER.li(:class => "page", :index => 0).click if BROWSER.li(:class => "page", :index => 0).present?
66
+ wait_action()
67
+ return true
68
+ end
69
+ end
70
+ def wait_action()
71
+ Watir::Wait.until(timeout = 120){(!BROWSER.div(:class => "results-update").present?)}
72
+ end
73
+ #validar que se muestren correctamente los precios si la sesion expiro
74
+ def validate_prices_session_expired(ticket)
75
+ !ticket.tarifas['adicional'].nil?
76
+ end
77
+ #validar que se muestren correctamente los precios si la sesion no expiro
78
+ def validate_prices_without_session_expired(ticket)
79
+ ticket.tarifas['adicional'].nil?
80
+ end
81
+ #validaciones del popup de mas detalles
82
+ def mostrar_mas_detalles_nr(search)
83
+ #TODO que cargue el pop up
84
+ if search.type !~ /multipledestinations/
85
+ BROWSER.div(:class=>'cluster',:index=>0).div(:class,"sub-cluster outbound").li(:class=>'stops',:index=> 0).links[0].click
86
+ Watir::Wait.until(timeout = 120){BROWSER.div(:id,'popup-detail').present?}
87
+ if BROWSER.div(:id,'popup-detail').present?
88
+ link_reglas_y_restricciones_nr(BROWSER.div(:id,'popup-detail'))
89
+ html_ida = BROWSER.div(:id,'popup-detail').html
90
+ BROWSER.div(:id,'popup-detail').span(:class,'popup-close-button popup-close').click
91
+ if search.type =~ /ida y vuelta/
92
+ BROWSER.div(:class=>'cluster',:index=>0).div(:class,"sub-cluster inbound").li(:class=>'stops',:index=> 0).links[0].click
93
+ Watir::Wait.until(timeout = 120){BROWSER.div(:id,'popup-detail').present?}
94
+ if BROWSER.div(:id,'popup-detail').present?
95
+ link_reglas_y_restricciones_nr(BROWSER.div(:id,'popup-detail'))
96
+ validar_mas_detalle_nr(html_ida,BROWSER.div(:id,'popup-detail').html)
97
+ BROWSER.div(:id,'popup-detail').span(:class,'popup-close-button popup-close').click
98
+ end
99
+ end
100
+ end
101
+ else
102
+ BROWSER.div(:class=>'cluster',:index=>0).li(:class=>'stops',:index=> 0).links[0].click
103
+ Watir::Wait.until(timeout = 120){BROWSER.div(:id,'popup-detail').present?}
104
+ if BROWSER.div(:id,'popup-detail').present?
105
+ link_reglas_y_restricciones_nr(BROWSER.div(:id,'popup-detail'))
106
+ validar_mas_detalle_nr(BROWSER.html)
107
+ BROWSER.div(:id,'popup-detail').span(:class,'popup-close-button popup-close').click
108
+ end
109
+ end
110
+ end
111
+ def link_reglas_y_restricciones_nr(elemento)
112
+ elemento.link(:class,'show-rules').click
113
+ sleep(1)
114
+ elemento.div(:class,'rules').should visible
115
+ end
116
+ def validar_mas_detalle_nr(html_ida,html_vuelta = nil)
117
+ ida = Hpricot.parse(html_ida)
118
+ vuelta = Hpricot.parse(html_vuelta) if html_vuelta
119
+ (ida/"div.segment li.itinerary span.date").select{|li| li.inner_text.empty?}.should is_empty
120
+ (ida/"div.rules/div.text").inner_text.empty?.should_not be_true
121
+ if html_vuelta
122
+ (vuelta/"div.segment li.itinerary span.date").select{|li| li.inner_text.empty?}.should is_empty
123
+ (vuelta/"div.rules/div.text").inner_text.empty?.should_not be_true
124
+ end
125
+ begin
126
+ ((ida/"span.location").first.inner_text.match(/(.+)\((...)\)/)[2] == search.from_city.code).should be_true
127
+ ((ida/"span.location").last.inner_text.match(/(.+)\((...)\)/)[2] == search.to_city.code).should be_true
128
+ if html_vuelta
129
+ ((vuelta/"span.location").first.inner_text.match(/(.+)\((...)\)/)[2] == search.to_city.code).should be_true
130
+ ((vuelta/"span.location").last.inner_text.match(/(.+)\((...)\)/)[2] == search.from_city.code).should be_true
131
+ end
132
+ rescue
133
+ true.should be_true
134
+ end
135
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require_relative 'helpers/landing'
3
+ require_relative 'helpers/browser'
4
+ require_relative 'helpers/clusters'
5
+ require_relative 'helpers/checkout'
@@ -0,0 +1,66 @@
1
+ # -*- encoding : utf-8 -*-
2
+ #clase que representa un precio, con su moneda y valor correspondiente
3
+ #se le pasa una string que contiene al precio(moneda y valor juntos)
4
+ class Price
5
+
6
+ include Comparable
7
+
8
+ attr_accessor :value, :currency
9
+
10
+ def initialize(precio, costos=nil, item=nil)
11
+ @currency = (precio.empty?) ? '$' : (precio.gsub(/\-|\.|\d/,'').upstrip == 'BSF' ? "Bs.F." : precio.gsub(/\-|\.|\d| /,'').upstrip )
12
+ @value = (precio.empty?) ? 0 : precio.match(/([^\s]+)\s+([^\s]+)/i)[2].strip.gsub(/\./,'').to_i
13
+ end
14
+
15
+ def moneda
16
+ self.currency
17
+ end
18
+
19
+ def valor
20
+ self.value
21
+ end
22
+
23
+ def set_valor(value)
24
+ @value = value
25
+ end
26
+
27
+ #metodo que pregunta si el precio es en dolares
28
+ def dolar?
29
+ self.currency =~ /(U\$S)|(U\$D)|(USD)|(US\$)|(\$US)/
30
+ end
31
+
32
+ #metodos de comparacion
33
+ def <=>(other)
34
+ ( (self.dolar? and other.dolar?) or self.same_moneda?(other) ) ? ( self.value <=> other.value ) : ( self.to_dolar.value <=> other.to_dolar.value)
35
+ end
36
+
37
+ #informa si la diferencia es mayor a un rango determinado
38
+ def diff(other,range)
39
+ ( (self.dolar? and other.dolar?) or self.same_moneda?(other) ) ? ( self.value <=> other.value ) : ( self.to_dolar.value <=> other.to_dolar.value )
40
+ end
41
+
42
+ #devuelve un string del precio
43
+ def to_s
44
+ "#{self.currency}#{self.value}"
45
+ end
46
+
47
+ def +(other)
48
+ ( self.same_moneda?(other) )? ( Precio.new("#{self.currency} #{self.value + other.value}",true) ) : ( Precio.new("U$S #{self.to_dolar.value + other.to_dolar.value}",true) )
49
+ end
50
+ def -(other)
51
+ ( self.same_moneda?(other) )? ( Precio.new("#{self.currency} #{self.value - other.value}","change") ) : ( Precio.new("U$S #{self.to_dolar.value - other.to_dolar.value}","change") )
52
+ end
53
+
54
+ def same_moneda?(other)
55
+ self.currency == other.currency or ver_moneda_en_base(other.currency) or (MainData.site =~ /ECUADOR/)
56
+ end
57
+
58
+ def zero?
59
+ self.value == 0
60
+ end
61
+
62
+ def empty?
63
+ self.zero?
64
+ end
65
+
66
+ end
@@ -0,0 +1,14 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Services
3
+ class Fenix
4
+ def self.start_test(id,body={},headers={})
5
+ respond = HTTParty.post("http://fenix-tools.despegar.it/fenix-tools/start-tests/#{id}",:body=>body,:headers=>headers)
6
+ puts respond
7
+ return respond
8
+ end
9
+ def self.test_status(id)
10
+ respond = JSON.parse(HTTParty.get "http://fenix-tools.despegar.it/fenix-tools/tests-status/#{id}")
11
+ return respond
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Services
3
+
4
+ class Landing
5
+
6
+ attr_accessor :json
7
+
8
+ def initialize(html)
9
+ @json = JSON.parse(get_json(html))
10
+ end
11
+
12
+ def get_json(html)
13
+ script=(html/"script").select{|script| script.inner_text.match('jsonData')}.first
14
+ return script.inner_text.match(/^\"jsonData\" \: (.*),$/)[1]
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,62 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'digest/md5'
3
+ module Services
4
+
5
+ class Results
6
+
7
+ attr_accessor :json, :json_no_referer
8
+
9
+ def initialize(browser,type)
10
+ @json = eval "get_json_#{type}(browser)"
11
+ @json_no_referer = eval "get_json_#{type}_no_referer(browser)"
12
+ end
13
+
14
+ def get_json_roundtrip(url)
15
+ begin
16
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA/NA?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
17
+ rescue Errno::ECONNRESET,Timeout::Error
18
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA/NA?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
19
+ end
20
+ end
21
+ def get_json_oneway(url)
22
+ begin
23
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
24
+ rescue Errno::ECONNRESET,Timeout::Error
25
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
26
+ end
27
+ end
28
+ def get_json_multipledestinations(url)
29
+ begin
30
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
31
+ rescue Errno::ECONNRESET,Timeout::Error
32
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING?hashForData=#{digest_md5(url)}",:headers => {"referer" => url})
33
+ end
34
+ end
35
+ def get_json_roundtrip_no_referer(url)
36
+ begin
37
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA/NA")
38
+ rescue Errno::ECONNRESET,Timeout::Error
39
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA/NA")
40
+ end
41
+ end
42
+ def get_json_oneway_no_referer(url)
43
+ begin
44
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA")
45
+ rescue Errno::ECONNRESET,Timeout::Error
46
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING/NA/NA/NA/NA")
47
+ end
48
+ end
49
+ def get_json_multipledestinations_no_referer(url)
50
+ begin
51
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING")
52
+ rescue Errno::ECONNRESET,Timeout::Error
53
+ HTTParty.get(url.gsub(/results/,"data/search") + "/TOTALFARE/ASCENDING")
54
+ end
55
+ end
56
+
57
+ def digest_md5(url)
58
+ return Digest::MD5.hexdigest(url+"despegar")
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require_relative 'services/results'
3
+ require_relative 'services/landing'
4
+ require_relative 'services/fenix'
@@ -0,0 +1,120 @@
1
+ # -*- encoding : utf-8 -*-
2
+ RSpec::Matchers.define :is_greater_than do |min|
3
+ match do |actual|
4
+ actual.to_i > min
5
+ end
6
+ failure_message_for_should do |actual|
7
+ "se esperaba que el valor #{actual} sea mayor a #{min}"
8
+ end
9
+ failure_message_for_should_not do |actual|
10
+ "se esperaba que el valor #{actual} no sea mayor a #{min}"
11
+ end
12
+ end
13
+
14
+ RSpec::Matchers.define :is_greater_equal_than do |min|
15
+ match do |actual|
16
+ actual.to_i >= min
17
+ end
18
+ failure_message_for_should do |actual|
19
+ "se esperaba que el valor #{actual} sea mayor o igual a #{min}"
20
+ end
21
+ failure_message_for_should_not do |actual|
22
+ "se esperaba que el valor #{actual} no sea mayor o igual a #{min}"
23
+ end
24
+ end
25
+
26
+ RSpec::Matchers.define :visible do
27
+ match do |actual|
28
+ actual.present?
29
+ end
30
+ failure_message_for_should do |actual|
31
+ "se esperaba que el elemento #{actual} sea visible"
32
+ end
33
+ failure_message_for_should_not do |actual|
34
+ "se esperaba que el elemento #{actual} no sea visible"
35
+ end
36
+ end
37
+
38
+ RSpec::Matchers.define :enabled do
39
+ match do |actual|
40
+ actual.enabled?
41
+ end
42
+ failure_message_for_should do |actual|
43
+ "se esperaba que el elemento #{actual} estuviera habilitado"
44
+ end
45
+ failure_message_for_should_not do |actual|
46
+ "se esperaba que el elemento #{actual} estuviera deshabilitado"
47
+ end
48
+ end
49
+
50
+ RSpec::Matchers.define :visible do |text|
51
+ match do |actual|
52
+ actual.present?
53
+ end
54
+ failure_message_for_should do |actual|
55
+ "se esperaba que el elemento #{text} sea visible"
56
+ end
57
+ failure_message_for_should_not do |actual|
58
+ "se esperaba que el elemento #{text} no sea visible"
59
+ end
60
+ end
61
+
62
+ RSpec::Matchers.define :match do |text_for_match|
63
+ match do |actual|
64
+ actual.match(/#{text_for_match}/)
65
+ end
66
+ failure_message_for_should do |actual|
67
+ "se esperaba que el texto #{actual} contenga a #{text_for_match}"
68
+ end
69
+ failure_message_for_should_not do |actual|
70
+ "se esperaba que el texto #{actual} no contenga a #{text_for_match}"
71
+ end
72
+ end
73
+
74
+ RSpec::Matchers.define :match_sensitive do |text_for_match|
75
+ match do |actual|
76
+ actual.match(/#{text_for_match}/i)
77
+ end
78
+ failure_message_for_should do |actual|
79
+ "se esperaba que el texto #{actual} contenga a #{text_for_match}"
80
+ end
81
+ failure_message_for_should_not do |actual|
82
+ "se esperaba que el texto #{actual} no contenga a #{text_for_match}"
83
+ end
84
+ end
85
+
86
+ RSpec::Matchers.define :equal do |text|
87
+ match do |actual|
88
+ actual == text
89
+ end
90
+ failure_message_for_should do |actual|
91
+ "se esperaba que el texto #{actual} sea igual a #{text}"
92
+ end
93
+ failure_message_for_should_not do |actual|
94
+ "se esperaba que el texto #{actual} no sea igual a #{text}"
95
+ end
96
+ end
97
+
98
+ RSpec::Matchers.define :include? do |text|
99
+ match do |actual|
100
+ actual.include?(text)
101
+ end
102
+ failure_message_for_should do |actual|
103
+ "se esperaba que la coleccion [#{actual.join('-')}] contenga a #{text}"
104
+ end
105
+ failure_message_for_should_not do |actual|
106
+ "se esperaba que la coleccion [#{actual.join('-')}] no contenga a #{text}"
107
+ end
108
+ end
109
+
110
+ RSpec::Matchers.define :is_empty do
111
+ match do |actual|
112
+ actual.empty?
113
+ end
114
+ failure_message_for_should do |actual|
115
+ "Se esperaba que la coleccion #{actual.join('-')} sea vacia"
116
+ end
117
+ failure_message_for_should_not do |actual|
118
+ "Se esperaba que la coleccion #{actual.join('-')} no sea vacia"
119
+ end
120
+ end
@@ -0,0 +1,42 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class String
3
+
4
+ def no_accents
5
+ return self.force_encoding("UTF-8").unaccent
6
+ end
7
+
8
+ def downstrip
9
+ return self.downcase.strip.gsub(/\n\r/,'')
10
+ end
11
+
12
+ def upstrip
13
+ return self.upcase.strip
14
+ end
15
+
16
+ end
17
+
18
+ class Date
19
+ def self.parse_new_result(string)
20
+ aux = string.gsub(/\.|\,/,'').match(/(\D.+) (\d{1,2}) (\D.+)(,|) (\d{4})/)
21
+ fecha = "#{aux[5]}/#{MONTHNAMES.index(aux[3].capitalize) ? MONTHNAMES.index(aux[3].capitalize) : ABBR_MONTHNAMES.index(aux[3].downcase)}/#{aux[2]}"
22
+ self.parse(fecha)
23
+ end
24
+ def self.parse_details(string)
25
+ aux = string.match(/(\d{1,2}) (\D.+) (\d{4}) (\d{2}):(\d{2})/)
26
+ fecha = "#{aux[3]}/#{ABBR_MONTHNAMES.index(aux[2].downcase)}/#{aux[1]}"
27
+ self.parse(fecha)
28
+ end
29
+ def self.parse_new_details(string)
30
+ aux = string.match(/(\D.+) (\d{1,2}) (\D.+)/)
31
+ fecha = "#{aux[2]}/#{ABBR_MONTHNAMES.index(aux[3].downcase)}/#{Date.today.year}"
32
+ date = self.parse(fecha)
33
+ date = date.next_year if date < Date.today
34
+ return date
35
+ end
36
+ def mes
37
+ return MONTHNAMES[self.month]
38
+ end
39
+ def mes_abrr
40
+ return ABBR_MONTHNAMES[self.month]
41
+ end
42
+ end
@@ -0,0 +1,33 @@
1
+ #language: es
2
+ @checkout
3
+ Característica: checkout.agency
4
+ IF000*
5
+
6
+ @agency
7
+ Esquema del escenario: Se ingresa al checkout con ciertos parametros de entrada, se llenan los campos y se compra el vuelo verificando que se realize la compra correctamente
8
+ Cuando Ingreso a la pagina de checkout de agencia en "<pais>" para una busqueda "<tipo>" del tipo "<cabotage>"
9
+ Cuando Verifico que ingrese al checkout
10
+ Y Si existe la opcion de cobertura, Elijo "no_chequear" si quiero cobertura
11
+ Y Verifico los datos de agencia afiliada
12
+ Y Verifico el pixel de Efrontier
13
+ Entonces Completo el formulario de pasajeros
14
+ Y Completo el formulario de tarjeta
15
+ Y Completo los datos de contacto
16
+ Y Realizo la compra
17
+ Entonces Verifico que dirija a la pagina de gracias
18
+ Entonces Si el checkout me pide mas datos de tarjeta, lleno los datos de tarjeta adicionales
19
+ Entonces Si se muestra el popup de no disponibilidad, elijo otro vuelo
20
+ Entonces Si debo completar de vuelta el formulario, completo el formulario
21
+ Y Verifico que genere id cro
22
+
23
+ @br
24
+ Ejemplos:
25
+ |pais|cabotage|tipo|
26
+ |BR|nil|roundtrip|
27
+ |BR|nil|oneway|
28
+ @us
29
+ Ejemplos:
30
+ |pais|cabotage|tipo|
31
+ |US|nil|roundtrip|
32
+ |US|nil|oneway|
33
+ |US|nil|multipledestinations|
@@ -0,0 +1,52 @@
1
+ #language: es
2
+ @checkout
3
+ Característica: checkout.button_cac
4
+ IF000*
5
+
6
+ @button_cac
7
+ Esquema del escenario: Se ingresa al checkout con ciertos parametros de entrada, se elije la opcion de reserva CAC y se realiza la compra
8
+ Cuando Ingreso a la pagina de resultados en "<pais>" para una busqueda "<tipo>" del tipo "<cabotage>"
9
+ Cuando Espero que termine de cargar
10
+ Entonces Verifico que traiga resultados
11
+ Cuando Elijo un itinerario y paso a checkout
12
+ Cuando Verifico que ingrese al checkout
13
+ Entonces Completo el formulario de pasajeros
14
+ Y Completo los datos para reservas CAC
15
+ Y Completo los datos de contacto
16
+ Y Realizo la compra
17
+ Entonces Verifico que dirija a la pagina de gracias
18
+ Entonces Si el checkout me pide mas datos de tarjeta, lleno los datos de tarjeta adicionales
19
+ Entonces Si se muestra el popup de no disponibilidad, elijo otro vuelo
20
+ Entonces Si debo completar de vuelta el formulario, completo el formulario para reservas CAC
21
+ Y Verifico que genere id cro
22
+
23
+ @ar
24
+ @roundtrip
25
+ Ejemplos:
26
+ |pais|tipo|cabotage|
27
+ |AR |roundtrip|nil|
28
+ @ar
29
+ @oneway
30
+ Ejemplos:
31
+ |pais|tipo|cabotage|
32
+ |AR |oneway|nil|
33
+ @ar
34
+ @multipledestinations
35
+ Ejemplos:
36
+ |pais|tipo|cabotage|
37
+ |AR |multipledestinations|nil|
38
+ @br
39
+ @roundtrip
40
+ Ejemplos:
41
+ |pais|tipo|cabotage|
42
+ |BR |roundtrip|true|
43
+ @br
44
+ @oneway
45
+ Ejemplos:
46
+ |pais|tipo|cabotage|
47
+ |BR |oneway|true|
48
+ @br
49
+ @roundtrip
50
+ Ejemplos:
51
+ |pais|tipo|cabotage|
52
+ |BR |roundtrip|true|
@@ -0,0 +1,20 @@
1
+ #language: es
2
+ @checkout
3
+ Característica: checkout.chat
4
+
5
+ @chat
6
+ Esquema del escenario: Se ingresa al checkout con ciertos parametros de entrada, se activa el chat y se loguea un user de prueba
7
+ Cuando Ingreso a la pagina de checkout en "<pais>" para una busqueda "<tipo>" del tipo "<cabotage>"
8
+ Cuando Verifico que ingrese al checkout
9
+ Cuando aplico el js del chat
10
+ Cuando espero que se muestre la caja del chat
11
+ Entonces me logueo al chat
12
+ Entonces verifico que se muestre todo correctamente
13
+ Y Cierro el chat
14
+
15
+ @ar
16
+ Ejemplos:
17
+ |pais|cabotage|tipo|
18
+ |AR|nil|roundtrip|
19
+ |AR|true|oneway|
20
+ |AR|nil|multipledestinations|
@@ -0,0 +1,54 @@
1
+ #language: es
2
+ @checkout
3
+ Característica: checkout.cupones
4
+ IF000*
5
+
6
+ @cupones
7
+ Esquema del escenario: Se ingresa al checkout con ciertos parametros de entrada, se llenan los campos y se compra el vuelo verificando que se realize la compra correctamente con un cupon de descuento
8
+ Cuando Ingreso a la pagina de resultados en "<pais>" para una busqueda "<tipo>" del tipo "<cabotage>"
9
+ Cuando Espero que termine de cargar
10
+ Entonces Verifico que traiga resultados
11
+ Cuando Elijo un itinerario y paso a checkout
12
+ Cuando Verifico que ingrese al checkout
13
+ Entonces Completo el formulario de pasajeros
14
+ Y Completo el formulario de tarjeta
15
+ Y Completo los datos de resolucion AFIP
16
+ Y Completo los datos de contacto
17
+ Y Si pide factura fiscal, Completo los campos de factura fiscal
18
+ Y Si permite cupon de descuento, Completo con un cupon de descuento invalido
19
+ Y Realizo la compra
20
+ Entonces Verifico que de error de cupon invalido
21
+
22
+ @ar
23
+ Ejemplos:
24
+ |pais|tipo|cabotage|
25
+ |AR |roundtrip|nil|
26
+ |AR |oneway|nil|
27
+ |AR |multipledestinations|nil|
28
+
29
+ @cupones
30
+ Esquema del escenario: Se ingresa al checkout con ciertos parametros de entrada, se llenan los campos y se compra el vuelo verificando que se realize la compra correctamente con un cupon de descuento
31
+ Cuando Ingreso a la pagina de resultados en "<pais>" para una busqueda "<tipo>" del tipo "<cabotage>"
32
+ Cuando Espero que termine de cargar
33
+ Entonces Verifico que traiga resultados
34
+ Cuando Elijo un itinerario y paso a checkout
35
+ Cuando Verifico que ingrese al checkout
36
+ Entonces Completo el formulario de pasajeros
37
+ Y Completo el formulario de tarjeta
38
+ Y Completo los datos de resolucion AFIP
39
+ Y Completo los datos de contacto
40
+ Y Si pide factura fiscal, Completo los campos de factura fiscal
41
+ Y Si permite cupon de descuento, Completo con un cupon de descuento valido
42
+ Y Realizo la compra
43
+ Entonces Verifico que dirija a la pagina de gracias
44
+ Entonces Si el checkout me pide mas datos de tarjeta, lleno los datos de tarjeta adicionales
45
+ Entonces Si se muestra el popup de no disponibilidad, elijo otro vuelo
46
+ Entonces Si debo completar de vuelta el formulario, completo el formulario
47
+ Y Verifico que genere id cro
48
+
49
+ @ar
50
+ Ejemplos:
51
+ |pais|tipo|cabotage|
52
+ |AR |roundtrip|nil|
53
+ |AR |oneway|nil|
54
+ |AR |multipledestinations|nil|