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,123 @@
1
+ # -*- encoding : utf-8 -*-
2
+ Then /^Abro el popup de registro$/ do
3
+ BROWSER.div(:id,'nibbler-common-header').span(:class,'nibbler-common-icon-favourites').click
4
+ Watir::Wait.until(timeout=20){BROWSER.div(:id,'nibbler-selfservice-login-overlay').present?}
5
+ end
6
+
7
+ Then /^Verifico links y textos del popup de registro$/ do
8
+ popup=BROWSER.div(:id,'nibbler-selfservice-login-overlay')
9
+ data_popup = Hpricot.parse(popup.html)
10
+ (data_popup/"div.nibbler-common-overlay-header").length.should equal(1)
11
+ (data_popup/"div.nibbler-common-overlay-body").length.should equal(1)
12
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row").length.should equal(2)
13
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div.nibbler-common-grid-col6").length.should equal(2)
14
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div.nibbler-common-grid-col6 a.nibbler-common-icon-facebook").length.should equal(1)
15
+ #(data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div.nibbler-common-grid-col6 span.nibbler-common-icon-google").length.should equal(1)
16
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div.nibbler-common-grid-col6 div.nibbler-selfservices-tabs li.nibbler-tab").length.should equal(2)
17
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div#nibbler-selfservice-sign-in-despegar form#nibbler-login-form input#signin-email").length.should equal(1)
18
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div#nibbler-selfservice-sign-in-despegar form#nibbler-login-form input#signin-pass").length.should equal(1)
19
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div#nibbler-selfservice-sign-in-despegar button.nibbler-selfservice-pass-button").length.should equal(2)
20
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div#nibbler-selfservice-sign-in-despegar form#nibbler-register-form input#signup-email").length.should equal(1)
21
+ (data_popup/"div.nibbler-common-overlay-body div.nibbler-common-grid-row div#nibbler-selfservice-sign-in-despegar form#nibbler-register-form input#signup-pass").length.should equal(1)
22
+ popup.li(:class=>'nibbler-tab',:index=>0).click
23
+ sleep(0.5)
24
+ popup.form(:id,'nibbler-login-form').should visible("formulario de login")
25
+ popup.li(:class=>'nibbler-tab',:index=>1).click
26
+ sleep(0.5)
27
+ popup.form(:id,'nibbler-register-form').should visible("formulario de registro")
28
+ popup.li(:class=>'nibbler-tab',:index=>0).click
29
+ sleep(0.5)
30
+ end
31
+
32
+ Then /^Me logueo con usuario "(.*)" y pass "(.*)"$/ do |email,pass|
33
+ popup=BROWSER.div(:id,'nibbler-selfservice-login-overlay')
34
+ popup.text_field(:id,'signin-email').set(email)
35
+ popup.text_field(:id,'signin-pass').set(pass)
36
+ popup.button(:class,'nibbler-selfservice-pass-button').click
37
+ sleep(1)
38
+ end
39
+
40
+ Then /^Verifico que se muestre el error de logueo$/ do
41
+ BROWSER.div(:id,'nibbler-selfservice-login-overlay').span(:class,'nibbler-error-40101 nibbler-form-error').should visible("error de logueo")
42
+ BROWSER.div(:id,'nibbler-selfservice-login-overlay').span(:class,'nibbler-error-40101 nibbler-form-error').text.should match('Password is incorrect|A senha est.{1,2} incorreta|La contrase.{1,2}a es incorrecta')
43
+ end
44
+
45
+ Then /^Verifico que se muestren en el header el usuario logueado$/ do
46
+ Watir::Wait.until(timeout=20){BROWSER.div(:id,'nibbler-common-header').div(:class,'fb-description').present?}
47
+ sleep(1)
48
+ BROWSER.div(:id,'nibbler-common-header').div(:class,'fb-description').strong(:class,'social-name').text.should equal("testvuelos@despegar.com")
49
+ BROWSER.div(:id,'nibbler-common-header').li(:class,'nibbler-common-header-favorites nibbler-user nibbler-common-header-favorites-has').should visible("corazon rojo en el header")
50
+ end
51
+
52
+ Then /^Abro la lista de deseos$/ do
53
+ BROWSER.div(:id,'nibbler-common-header').span(:class,'nibbler-common-icon-favourites').click
54
+ end
55
+
56
+ Then /^Verifico textos y que no se muestren opciones en la lista de deseos$/ do
57
+ BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').div(:class,'nibbler-common-last-searches nibbler-common-header-favorites-list').should visible("lista de elementos vacio")
58
+ BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').div(:class,'nibbler-common-last-searches nibbler-common-with').should_not visible("lista con deseos")
59
+ end
60
+
61
+ Then /^Cierro la lista de deseos$/ do
62
+ BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').span(:class,'exit').click
63
+ sleep(1)
64
+ end
65
+
66
+ Then /^Elijo un itinerario como deseado$/ do
67
+ BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-outbound-0').click if BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-outbound-0').present?
68
+ BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-inbound-0').click if BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-inbound-0').present?
69
+ BROWSER.div(:id,'clusters').div(:class,'cluster').div(:class,'icons').span(:class,'icon-wishlist ux-common-icon-favourites cluster-actions-icon').should visible("icono de deseado")
70
+ BROWSER.div(:id,'clusters').div(:class,'cluster').div(:class,'icons').span(:class,'icon-wishlist ux-common-icon-favourites cluster-actions-icon').click
71
+ cluster = ResultsCluster.new(@search.description,Hpricot.parse(BROWSER.div(:id,'clusters').div(:class,'cluster').html))
72
+ end
73
+
74
+ Then /^Verifico que el itinerario deseado quede marcado$/ do
75
+ sleep(2)
76
+ BROWSER.div(:id,'clusters').div(:class,'cluster').div(:class,'icons').span(:class,'icon-wishlist ux-common-icon-favourites cluster-actions-icon ux-common-icon-favourites-selected').should visible("icono de deseado seleccionado")
77
+ end
78
+
79
+ Then /^Verifico que el itinerario deseado quede en la lista de deseos$/ do
80
+ BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').div(:class,'nibbler-common-last-searches nibbler-common-with').should visible("lista de deseos")
81
+ end
82
+
83
+ Then /^Elijo el itinerario de la lista de deseos$/ do
84
+ @url = BROWSER.url
85
+ BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').div(:class,'nibbler-common-last-searches nibbler-common-with').click
86
+ end
87
+
88
+ Then /^Verifico que dirija correctamente a la pagina de resultados$/ do
89
+ @url.downcase.should match("#{BROWSER.url.gsub(/\?(.*)/,'').downcase}")
90
+ end
91
+
92
+ Then /^Verifico que el itinerario deseado este marcado correctamente$/ do
93
+ BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-outbound-0').set?.should be_true if BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-outbound-0').present?
94
+ BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-inbound-0').set?.should be_true if BROWSER.div(:id,'clusters').div(:class,'cluster').radio(:id,'0-inbound-0').present?
95
+ BROWSER.div(:id,'clusters').div(:class,'cluster').div(:class,'icons').span(:class,'icon-wishlist ux-common-icon-favourites cluster-actions-icon ux-common-icon-favourites-selected').should visible("icono de deseado seleccionado")
96
+ BROWSER.div(:id,'clusters').div(:class,'cluster').span(:class,'ux-common-icon-favourites').should visible("icono de deseado en lista de precios")
97
+ end
98
+
99
+ Then /^Elimino el itinerario de la lista de deseos$/ do
100
+ sleep(1)
101
+ BROWSER.execute_script("javascript:void($('.action-delete').click());")
102
+ sleep(2)
103
+ BROWSER.execute_script("javascript:void($('.action-delete').click());")
104
+ sleep(2)
105
+ end
106
+
107
+ Then /^Limpio la lista de deseos$/ do
108
+ if BROWSER.div(:class,'nibbler-popup-wishlist nibbler-header-popup big').div(:class,'nibbler-common-last-searches nibbler-common-with').present?
109
+ sleep(1)
110
+ BROWSER.execute_script("javascript:void($('.action-delete').click());")
111
+ sleep(2)
112
+ end
113
+ end
114
+
115
+ Then /^Me deslogueo como usuario$/ do
116
+ BROWSER.div(:id,'nibbler-common-header').link(:class,'social-logged').click if BROWSER.div(:id,'nibbler-common-header').link(:class,'social-logged').present?
117
+ end
118
+
119
+ Then /^Verifico que no se muestre en el header el usuario logueado$/ do
120
+ BROWSER.div(:id,'nibbler-common-header').span(:class,'nibbler-user-icon social-login').should visible("boton de logueo")
121
+ BROWSER.div(:id,'nibbler-common-header').div(:class,'fb-description').should_not visible("usuario logueado")
122
+ BROWSER.div(:id,'nibbler-common-header').li(:class,'nibbler-common-header-favorites nibbler-user nibbler-common-header-favorites-has').should_not visible("corazon rojo en el header")
123
+ end
@@ -0,0 +1,61 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rubygems'
3
+ require 'sixarm_ruby_unaccent'
4
+ require 'watir-webdriver'
5
+ require 'rspec'
6
+ require 'hpricot'
7
+ require 'httparty'
8
+ require 'henry/environment'
9
+ require 'sanitize'
10
+ require 'uri'
11
+ require 'mock_search'
12
+
13
+ $VERBOSE = nil
14
+
15
+ require_relative 'lib/price'
16
+ require_relative 'lib/clusters'
17
+ require_relative 'lib/helpers'
18
+ require_relative 'matchers'
19
+
20
+ SITES_FENIX = ["AR","BR","US","MX","EC","CR","CO","VE","PE","UY","CL","PA"]
21
+
22
+ def init_browser(type)
23
+ case type.upcase
24
+ when 'IE' then
25
+ :ie
26
+ when 'FIREFOX' then
27
+ :firefox
28
+ when 'CHROME' then
29
+ :chrome
30
+ else
31
+ :chrome
32
+ end
33
+ end
34
+
35
+ def add_cookie(type)
36
+ case type.upcase
37
+ when 'RESULTS' then "results-f-gui=beta"
38
+ when 'CHECKOUT' then "chkf-app=beta"
39
+ when 'LANDING' then "landing-f-gui=beta"
40
+ when 'FSM' then "fsm-rest=beta"
41
+ else "landing-f-gui=beta|results-f-gui=beta|chkf-app=beta"
42
+ end
43
+ end
44
+
45
+ begin
46
+ $henry_params = Henry::Environment.params
47
+ puts $henry_params
48
+ $ENV = $henry_params['env'] || "produccion"
49
+ browser = $henry_params['browser']
50
+ COOKIE = add_cookie($henry_params['product'])
51
+ rescue
52
+ $ENV = "produccion"
53
+ browser = "firefox"
54
+ end
55
+
56
+ if browser
57
+ BROWSER = Watir::Browser.new init_browser(browser)
58
+ screen_width = BROWSER.execute_script("return screen.width;")
59
+ screen_height = BROWSER.execute_script("return screen.height;")
60
+ BROWSER.window.resize_to(screen_width, screen_height)
61
+ end
@@ -0,0 +1,33 @@
1
+ class DatosNew
2
+ attr_accessor :origen, :destino, :fecha, :aerolinea, :escalas, :destino_iata, :origen_iata, :hou_sal_ida, :hou_lle_ida,:attributes, :duracion
3
+
4
+ def initialize (origen,destino,fecha, aerolinea, escalas, origen_iata=nil, destino_iata=nil,hou_sal_ida=nil,hou_lle_ida=nil,duracion=nil)
5
+
6
+ @duracion = duracion
7
+ @origen = origen
8
+ @destino = destino
9
+ @origen_iata = origen_iata
10
+ @destino_iata = destino_iata
11
+ @fecha = fecha.empty? ? nil : Date.parse_new_result(fecha)
12
+ @aerolinea = aerolinea
13
+ @escalas = escalas
14
+ @hou_sal_ida = hou_sal_ida
15
+ @hou_lle_ida = hou_lle_ida
16
+ @attributes = [:origen, :destino, :origen_iata, :destino_iata, :fecha, :aerolinea, :escalas, :hou_sal_ida, :hou_lle_ida, :duracion]
17
+ end
18
+
19
+ def to_s
20
+ return "Duracion: #{@duracion}, Origen: #{@origen}, Destino: #{@destino}, Iata: #{@origen_iata}-#{@destino_iata}, Fecha: #{@fecha}, Aerolinea: #{@aerolinea}, Hr salida: #{@hou_sal_ida}, Hr llegada: #{@hou_lle_ida}"
21
+ end
22
+
23
+ #se usa en el dinamico para comparar
24
+ def ==(other)
25
+ eq = true
26
+ self.attributes.each do |attrb|
27
+ if other
28
+ eq = false if self.send(attrb) != other.send(attrb)
29
+ end
30
+ end
31
+ eq
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class DetailsCluster
3
+ attr_accessor :tramos, :duracion
4
+ def initialize(p_html)
5
+ @duracion = (p_html/"div.popup-container div.popup-content span.total-duration").inner_text.strip.no_accents
6
+ @tramos = []
7
+ (p_html/"div.popup-container div.popup-content div.detail").each do |div|
8
+ tramo = Hash.new
9
+ tramo['clase'] = (div/"div.segment span.class").first.inner_text.strip.no_accents
10
+ tramo['ciudad_origen'] = (div/"li.departure span.location span.data").first.inner_text.strip.no_accents
11
+ tramo['fecha_origen'] = Date.parse_new_details((div/"li.departure span.date span.day").first.inner_text.strip.no_accents)
12
+ tramo['hora_origen'] = Time.parse((div/"li.departure span.date span.hour").first.inner_text.strip.no_accents)
13
+ tramo['ciudad_destino'] = (div/"li.arrival span.location span.data").last.inner_text.strip.no_accents
14
+ tramo['hora_destino'] = Time.parse((div/"li.arrival span.date span.hour").last.inner_text.strip.no_accents)
15
+ @tramos << tramo
16
+ end
17
+ end
18
+
19
+ def to_s
20
+ text = String.new
21
+ @tramos.each_with_index do |tramo,i|
22
+ text << "[Tramo #{i}: "
23
+ tramo.each_pair do |key,value|
24
+ text << "#{key}:#{value} - "
25
+ end
26
+ text << "]"
27
+ end
28
+ return text
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class LandingCluster < ResultsCluster
3
+
4
+ def load_prices(p_html)
5
+
6
+ @tarifas = Hash.new
7
+ @tarifas['tarifa_adulto'] = Price.new((p_html/"span.price-currency span.currency").first.inner_text.strip + " " + (p_html/"span.price-currency span.amount").first.inner_text.strip)
8
+ @tarifas['tarifa_adulto_dolar'] = Price.new((p_html/"span.price-currency span.currency").last.inner_text.strip + " " + (p_html/"span.price-currency span.amount").last.inner_text.strip)
9
+ @tarifas['adt'] = (p_html/"ul.fare-detail//li").empty? ? Price.new("$ 0",true) : Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /adulto/}.first/"span[@class='price-currency ARS']").inner_text.strip)
10
+
11
+ adt = (p_html/"li").select{|li| li.inner_text.no_accents.downcase =~ /adulto/}.first
12
+ @tarifas['adt'] = adt ? Price.new((adt/"span.currency").first.inner_text.strip + " " + (adt/"span.amount").first.inner_text.strip) : Price.new("$ 0",true)
13
+
14
+ tasas = (p_html/"li.taxes-price").empty? ? (p_html/"li[@class='taxDetail.OTHER-price']").first : (p_html/"li.taxes-price").first
15
+ @tarifas['tasas'] = tasas ? Price.new((tasas/"span.currency").first.inner_text.strip + " " + (tasas/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
16
+
17
+ cargos = (p_html/"li.charges-price").first
18
+ @tarifas['cargos'] = cargos ? Price.new((cargos/"span.currency").first.inner_text.strip + " " + (cargos/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
19
+
20
+ afip = (p_html/"li[@class='taxDetail.ZK-price']").first
21
+ @tarifas['afip'] = afip ? Price.new((afip/"span.currency").first.inner_text.strip + " " + (afip/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
22
+
23
+ @tarifas['encargos'] = Price.new("$ 0",true)
24
+
25
+ campo = (p_html/"li").empty? ? "total" : "fare"
26
+ @tarifas['total'] = (p_html/"li.#{campo}-price span.currency").empty? ? Price.new("$ 0",true) : Price.new((p_html/"li.#{campo}-price span.currency").first.inner_text.strip + " " + (p_html/"li.#{campo}-price span.amount").first.inner_text.strip)
27
+ end
28
+
29
+ end
@@ -0,0 +1,43 @@
1
+ class RenderCluster < ResultsCluster
2
+ def load_prices(p_html)
3
+
4
+ @tarifas = Hash.new
5
+
6
+ if !(p_html/"div.fare-difference").empty?
7
+ con_diferencia(p_html)
8
+ else
9
+ sin_diferencia(p_html)
10
+ end
11
+
12
+ end
13
+
14
+ def con_diferencia(p_html)
15
+ if (p_html/"span.difference-description").inner_text.strip.match(/Sin costo adicional|Sem costo adicional|Sem custo adicional/)
16
+ @tarifas['adicional'] = Price.new("$ 0",true)
17
+ else
18
+ @tarifas['adicional'] = Price.new((p_html/"span.difference-price/span.currency").inner_text.strip + " " + (p_html/"span.difference-price/span.amount").inner_text.strip,true)
19
+ @tarifas['adicional'].set_valor(@tarifas['adicional'].valor * ((p_html/"span.difference-price/span.difference").inner_text.match(/\+/) ? 1 : -1))
20
+ end
21
+ @tarifas['tarifa_adulto'] = Price.new("$ 0",true)
22
+ @tarifas['tarifa_adulto_dolar'] = Price.new("$ 0",true)
23
+ @tarifas['adt'] = Price.new("$ 0",true)
24
+ @tarifas['cnn'] = Price.new("$ 0",true)
25
+ @tarifas['inf'] = Price.new("$ 0",true)
26
+ @tarifas['tasas'] = Price.new("$ 0",true)
27
+ @tarifas['cargos'] = Price.new("$ 0",true)
28
+ @tarifas['encargos'] = Price.new("$ 0",true)
29
+ @tarifas['total'] = (p_html/"div.fare-total/span.total-price").empty? ? Price.new("$ 0",true) : Price.new((p_html/"div.fare-total/span.total-price").first.inner_text.strip)
30
+ end
31
+
32
+ def sin_diferencia(p_html)
33
+ @tarifas['tarifa_adulto'] = Price.new((p_html/"span.fare/span.price-currency").first.inner_text.strip)
34
+ @tarifas['tarifa_adulto_dolar'] = Price.new((p_html/"span.fare/span.price-currency").last.inner_text.strip)
35
+ @tarifas['adt'] = (p_html/"ul.fare-detail//li").empty? ? Price.new("$ 0",true) : Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /adulto/}.first/"span[@class='price-currency ARS']").inner_text.strip)
36
+ @tarifas['cnn'] = (p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /nino/}.first ? Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /nino/}.first/"span[@class='price-currency ARS']").inner_text.strip,true) : Price.new("$ 0",true)
37
+ @tarifas['inf'] = (p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /bebe/}.first ? Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /bebe/}.first/"span[@class='price-currency ARS']").inner_text.strip,true) : Price.new("$ 0",true)
38
+ @tarifas['tasas'] = (p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /tasas/}.first ? Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /tasas/}.first/"span[@class='price-currency ARS']").inner_text.strip,true) : Price.new("$ 0",true)
39
+ @tarifas['cargos'] = (p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /cargos/}.first ? Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /cargos/}.first/"span[@class='price-currency ARS']").inner_text.strip,true) : Price.new("$ 0",true)
40
+ @tarifas['encargos'] = Price.new("$ 0",true)
41
+ @tarifas['total'] = (p_html/"ul.fare-detail/li.total-price//span.price-currency").empty? ? Price.new("$ 0",true) : Price.new((p_html/"ul.fare-detail/li.total-price//span.price-currency").first.inner_text.strip)
42
+ end
43
+ end
@@ -0,0 +1,140 @@
1
+ require_relative 'data/datos_new'
2
+ class ResultsCluster
3
+
4
+ attr_accessor :ida, :vuelta, :tarifas, :idas, :vueltas
5
+
6
+ def initialize(itinerario,html,page = 0)
7
+ eval "#{itinerario.downcase}(html)"
8
+ self.load_prices((html/"div.fare-container"))
9
+ end
10
+
11
+ def roundtrip(html)
12
+ self.load_data_from((html/"div.itineraries div[@class='sub-cluster outbound']"))
13
+ self.load_data_to((html/"div.itineraries div[@class='sub-cluster inbound']"))
14
+ end
15
+ def oneway(html)
16
+ self.load_data_from((html/"div.itineraries//div[@class='sub-cluster outbound']"))
17
+ @nro_vuelo_vuelta = -1
18
+ end
19
+ def multipledestinations(html)
20
+ self.load_data_from((html/"div.itineraries//div[@class='sub-cluster multiple']"))
21
+ self.load_data_to((html/"div.itineraries//div[@class='sub-cluster multiple']").last)
22
+ end
23
+ def load_data_from(div_datos)
24
+ @idas = Array.new
25
+ (div_datos/"li.itinerary").each do |div_datos_ida|
26
+ duracion = (div_datos_ida/"li.time").inner_text.strip
27
+ origen = (div_datos/"li.city-departure").first.inner_text.gsub(/,/,'').strip.no_accents
28
+ destino= (div_datos/"li.city-arrival").first.inner_text.gsub(/,/,'').strip.no_accents
29
+ origen_iata = (div_datos/"a").empty? ? (div_datos/"div.fechayDestinos/span.aeropuertoSalida").inner_text.match(/(.+)\((.+)\)(.+)/)[2].strip : (div_datos/"a")[0].inner_text.strip
30
+ destino_iata = (div_datos/"a").empty? ? (div_datos/"div.fechayDestinos/span.aeropuertoLlegada").inner_text.match(/(.+)\((.+)\)/)[2].strip : (div_datos/"a")[1].inner_text.strip
31
+ fecha = (div_datos_ida/"li.date").empty? ? (div_datos/"li.date").first.inner_text.strip.no_accents : (div_datos_ida/"li.date").first.inner_text.strip.no_accents
32
+ escala = (div_datos_ida/"li.stops/a").inner_text.strip.empty? ? "Sin escalas" : (div_datos_ida/"li.stops/a").inner_text.to_i
33
+ aerolinea = Array.new
34
+ i = 0
35
+ (div_datos_ida/"li.airlinesShort//img").each do |aer|
36
+ aerolinea << aer.attributes['src'].match(/(..).png/)[1].upcase
37
+ i = i + 1
38
+ end
39
+ (div_datos_ida/"li.airlines//img").each do |aer|
40
+ aerolinea << aer.attributes['src'].match(/(..).png/)[1].upcase
41
+ i = i + 1
42
+ end
43
+ hou_sal_ida = Time.parse((div_datos_ida/"li.leave/strong").inner_text.strip)
44
+ hou_lle_ida = Time.parse((div_datos_ida/"li.arrive/strong").inner_text.strip)
45
+ @idas << DatosNew.new(origen,destino,fecha, aerolinea, escala_to_i(escala),origen_iata,destino_iata,hou_sal_ida,hou_lle_ida,duracion)
46
+ end
47
+ @nro_vuelo_ida = 0
48
+ @ida = @idas[@nro_vuelo_ida]
49
+
50
+ end
51
+ def load_data_to(div_datos)
52
+
53
+ @vueltas = Array.new
54
+ (div_datos/"li.itinerary").each do |div_datos_vuelta|
55
+ duracion = (div_datos_vuelta/"li.time").inner_text.strip
56
+ origen = (div_datos/"li.city-departure").first.inner_text.gsub(/,/,'').strip.no_accents
57
+ destino= (div_datos/"li.city-arrival").first.inner_text.gsub(/,/,'').strip.no_accents
58
+ origen_iata = (div_datos/"a").empty? ? (div_datos/"div.fechayDestinos/span.aeropuertoSalida").inner_text.match(/(.+)\((.+)\)(.+)/)[2].strip : (div_datos/"a")[0].inner_text.strip
59
+ destino_iata = (div_datos/"a").empty? ? (div_datos/"div.fechayDestinos/span.aeropuertoLlegada").inner_text.match(/(.+)\((.+)\)/)[2].strip : (div_datos/"a")[1].inner_text.strip
60
+ fecha = (div_datos_vuelta/"li.date").empty? ? (div_datos/"li.date").last.inner_text.strip.no_accents : (div_datos_vuelta/"li.date").last.inner_text.strip.no_accents
61
+ escala = (div_datos_vuelta/"li.stops/a").inner_text.strip.empty? ? "Sin escalas" : (div_datos_vuelta/"li.stops/a").inner_text.to_i
62
+ aerolinea = Array.new
63
+ i = 0
64
+ (div_datos_vuelta/"li.airlinesShort//img").each do |aer|
65
+ aerolinea << aer.attributes['src'].match(/(..).png/)[1].upcase
66
+ i = i + 1
67
+ end
68
+ (div_datos_vuelta/"li.airlines//img").each do |aer|
69
+ aerolinea << aer.attributes['src'].match(/(..).png/)[1].upcase
70
+ i = i + 1
71
+ end
72
+ hou_sal_ida = Time.parse((div_datos_vuelta/"li.leave/strong").inner_text.strip)
73
+ hou_lle_ida = Time.parse((div_datos_vuelta/"li.arrive/strong").inner_text.strip)
74
+ @vueltas << DatosNew.new(origen,destino,fecha, aerolinea, escala_to_i(escala),origen_iata,destino_iata,hou_sal_ida,hou_lle_ida,duracion)
75
+ end
76
+ @nro_vuelo_vuelta = 0
77
+ @vuelta = @vueltas[@nro_vuelo_vuelta]
78
+
79
+ end
80
+
81
+ def load_prices(p_html)
82
+
83
+ @tarifas = Hash.new
84
+ @tarifas['tarifa_adulto_dolar'] = Price.new((p_html/"span.price-currency span.currency").last.inner_text.strip + " " + (p_html/"span.price-currency span.amount").last.inner_text.strip)
85
+ if (p_html/"span[@class='price-currency #{currency($SITE)} '] span.currency").first
86
+ @tarifas['tarifa_adulto'] = Price.new((p_html/"span[@class='price-currency #{currency($SITE)} '] span.currency").first.inner_text.strip + " " + (p_html/"span[@class='price-currency #{currency($SITE)} '] span.amount").first.inner_text.strip)
87
+ else
88
+ @tarifas['tarifa_adulto'] = @tarifas['tarifa_adulto_dolar']
89
+ end
90
+ @tarifas['adt'] = (p_html/"ul.fare-detail//li").empty? ? Price.new("$ 0",true) : Price.new(((p_html/"ul.fare-detail//li").select{|li| li.inner_text.no_accents.downcase =~ /adulto/}.first/"span[@class='price-currency ARS']").inner_text.strip)
91
+
92
+ adt = (p_html/"li").select{|li| li.inner_text.no_accents.downcase =~ /adulto/}.first
93
+ @tarifas['adt'] = adt ? Price.new((adt/"span.currency").first.inner_text.strip + " " + (adt/"span.amount").first.inner_text.strip) : Price.new("$ 0",true)
94
+
95
+ tasas = (p_html/"li.taxes-price").empty? ? (p_html/"li[@class='taxDetail.OTHER-price']").first : (p_html/"li.taxes-price").first
96
+ @tarifas['tasas'] = tasas ? Price.new((tasas/"span.currency").first.inner_text.strip + " " + (tasas/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
97
+
98
+ cargos = (p_html/"li.charges-price").first
99
+ @tarifas['cargos'] = cargos ? Price.new((cargos/"span.currency").first.inner_text.strip + " " + (cargos/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
100
+
101
+ afip = (p_html/"li[@class='taxDetail.ZK-price']").first
102
+ @tarifas['afip'] = afip ? Price.new((afip/"span.currency").first.inner_text.strip + " " + (afip/"span.amount").first.inner_text.strip,true) : Price.new("$ 0",true)
103
+
104
+ @tarifas['encargos'] = Price.new("$ 0",true)
105
+
106
+ campo = (p_html/"li").empty? ? "total" : "fare"
107
+ @tarifas['total'] = (p_html/"li.#{campo}-price span.currency").empty? ? Price.new("$ 0",true) : Price.new((p_html/"li.#{campo}-price span.currency").first.inner_text.strip + " " + (p_html/"li.#{campo}-price span.amount").first.inner_text.strip)
108
+ end
109
+
110
+ def validarSumaDesgloce(linea = "total|tarifa_adulto")
111
+
112
+ sumaTarifas = 0
113
+ @tarifas.each_pair do |key,tarifa|
114
+ if key !~ /#{linea}/
115
+ sumaTarifas += tarifa.valor
116
+ end
117
+ if @tarifas['total'] and (tarifa.valor > @tarifas['total'].valor) and (linea !~ /tarifa_adulto/)
118
+ true.should be_true
119
+ end
120
+ end
121
+
122
+ if @tarifas['total'] and ((sumaTarifas.to_i - @tarifas['total'].valor.to_i) > 3)
123
+ true.should be_true
124
+ end
125
+
126
+ end
127
+ def validarEcuacionTarifasPorCantidadDePasajeros(cant)
128
+ unless @tarifas['adt'].valor.zero?
129
+ (@tarifas['adt'].valor == @tarifas['tarifa_adulto'].valor * cant).should be_true
130
+ end
131
+ end
132
+ def validarResolucionAFIP
133
+ (@tarifas['total'] * 20 / 100).truncate + 1 == @tarifas['afip']
134
+ end
135
+ def total_escalas()
136
+ vueltas = @vueltas ? @vueltas.collect{|vuelta| vuelta.escalas} : []
137
+ (vueltas + @idas.collect{|vuelta| vuelta.escalas}).sort
138
+ end
139
+
140
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require_relative 'clusters/results_cluster'
3
+ require_relative 'clusters/results/landing_cluster'
4
+ require_relative 'clusters/results/render_cluster'
5
+ require_relative 'clusters/details/details_cluster'