Advertisement
vasiliqa

Test for Hoodies

Apr 21st, 2021
1,353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 5.34 KB | None | 0 0
  1. # Тут находится программа, выполняющая обработку данных из файла.
  2. # Тест показывает как программа должна работать.
  3. # В этой программе нужно обработать файл данных data_large.txt.
  4.  
  5. # Ожидания от результата:
  6.  
  7. # Корректная обработатка файла data_large.txt;
  8. # Проведена оптимизация кода и представлены ее результаты;
  9. # Production-ready код;
  10. # Применены лучшие практики;
  11.  
  12. require 'json'
  13. require 'pry'
  14. require 'date'
  15. require 'minitest/autorun'
  16. require 'benchmark'
  17. require 'set'
  18.  
  19. def parse_session(fields)
  20.   {
  21.     browser: fields[3].upcase,
  22.     time: fields[4],
  23.     date: fields[5]
  24.   }
  25. end
  26.  
  27. def calculate_user_stats(user, result_user_stats)
  28.   return if user[:name].nil?
  29.  
  30.   user_stats = {}
  31.   user_stats[:sessionsCount] = user[:sessions].count
  32.  
  33.   session_durations = user[:sessions].map { |session| session[:time].to_i }
  34.   user_stats[:totalTime] = "#{session_durations.sum} min."
  35.   user_stats[:longestSession] = "#{session_durations.max} min."
  36.  
  37.   browsers = user[:sessions].map { |session| session[:browser] }.sort
  38.   user_stats[:browsers] = browsers.join(', ')
  39.   user_stats[:usedIE] = browsers.any? { |browser| browser.match?(/INTERNET EXPLORER/) }
  40.   user_stats[:alwaysUsedChrome] = browsers.all? { |browser| browser.match?(/CHROME/) }
  41.  
  42.   session_dates = user[:sessions].map { |session| Date.parse(session[:date]) }
  43.   user_stats[:dates] = session_dates.sort.reverse.map(&:iso8601)
  44.  
  45.   result_user_stats[user[:name]] = user_stats
  46. end
  47.  
  48. def handle_file
  49.   current_user = { name: nil, sessions: [] }
  50.   result = {
  51.     users_count: 0,
  52.     sessions_count: 0,
  53.     uniq_browsers: Set.new,
  54.     users_stats: {}
  55.   }
  56.  
  57.   File.open('data_large.txt').each do |line|
  58.     fields = line.split(',')
  59.     entry_class = fields[0]
  60.  
  61.     case entry_class
  62.     when 'user'
  63.       calculate_user_stats(current_user, result[:users_stats])
  64.       result[:users_count] += 1
  65.       current_user = { name: "#{fields[2]} #{fields[3]}", sessions: [] }
  66.     when 'session'
  67.       current_user[:sessions] << parse_session(fields)
  68.       result[:sessions_count] += 1
  69.       result[:uniq_browsers] << fields[3].upcase
  70.     end
  71.   end
  72.  
  73.   calculate_user_stats(current_user, result[:users_stats])
  74.  
  75.   result
  76. end
  77.  
  78. def work
  79.   result = handle_file
  80.  
  81.   report = {
  82.     totalUsers: result[:users_count],
  83.     totalSessions: result[:sessions_count],
  84.     uniqueBrowsersCount: result[:uniq_browsers].count,
  85.     allBrowsers: result[:uniq_browsers].to_a.sort.join(','),
  86.     usersStats: result[:users_stats]
  87.   }
  88.  
  89.   File.write('result.json', "#{report.to_json}\n")
  90. end
  91.  
  92. # Benchmark.bmbm do |x|
  93. #   x.report('work') { work }
  94. # end
  95.  
  96. # Rehearsal ----------------------------------------
  97. # work  49.371923   0.657388  50.029311 ( 50.304776)
  98. # ------------------------------ total: 50.029311sec
  99.  
  100. #            user     system      total        real
  101. # work  48.509724   0.419018  48.928742 ( 49.084887)
  102.  
  103. class TestMe < Minitest::Test
  104.   def setup
  105.     File.write('result.json', '')
  106.     File.write(
  107.       'data_large.txt',
  108.       <<~TEXT
  109.         user,0,Leida,Cira,0
  110.         session,0,0,Safari 29,87,2016-10-23
  111.         session,0,1,Firefox 12,118,2017-02-27
  112.         session,0,2,Internet Explorer 28,31,2017-03-28
  113.         session,0,3,Internet Explorer 28,109,2016-09-15
  114.         session,0,4,Safari 39,104,2017-09-27
  115.         session,0,5,Internet Explorer 35,6,2016-09-01
  116.         user,1,Palmer,Katrina,65
  117.         session,1,0,Safari 17,12,2016-10-21
  118.         session,1,1,Firefox 32,3,2016-12-20
  119.         session,1,2,Chrome 6,59,2016-11-11
  120.         session,1,3,Internet Explorer 10,28,2017-04-29
  121.         session,1,4,Chrome 13,116,2016-12-28
  122.         user,2,Gregory,Santos,86
  123.         session,2,0,Chrome 35,6,2018-09-21
  124.         session,2,1,Safari 49,85,2017-05-22
  125.         session,2,2,Firefox 47,17,2018-02-02
  126.         session,2,3,Chrome 20,84,2016-11-25
  127.       TEXT
  128.     )
  129.   end
  130.  
  131.   def test_result
  132.     work
  133.     expected_result = '{"totalUsers":3,"uniqueBrowsersCount":14,"totalSessions":15,"allBrowsers":"CHROME 13,CHROME 20,CHROME 35,CHROME 6,FIREFOX 12,FIREFOX 32,FIREFOX 47,INTERNET EXPLORER 10,INTERNET EXPLORER 28,INTERNET EXPLORER 35,SAFARI 17,SAFARI 29,SAFARI 39,SAFARI 49","usersStats":{"Leida Cira":{"sessionsCount":6,"totalTime":"455 min.","longestSession":"118 min.","browsers":"FIREFOX 12, INTERNET EXPLORER 28, INTERNET EXPLORER 28, INTERNET EXPLORER 35, SAFARI 29, SAFARI 39","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-09-27","2017-03-28","2017-02-27","2016-10-23","2016-09-15","2016-09-01"]},"Palmer Katrina":{"sessionsCount":5,"totalTime":"218 min.","longestSession":"116 min.","browsers":"CHROME 13, CHROME 6, FIREFOX 32, INTERNET EXPLORER 10, SAFARI 17","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-04-29","2016-12-28","2016-12-20","2016-11-11","2016-10-21"]},"Gregory Santos":{"sessionsCount":4,"totalTime":"192 min.","longestSession":"85 min.","browsers":"CHROME 20, CHROME 35, FIREFOX 47, SAFARI 49","usedIE":false,"alwaysUsedChrome":false,"dates":["2018-09-21","2018-02-02","2017-05-22","2016-11-25"]}}}' + "\n"
  134.     parsed_expected = JSON.parse(expected_result)
  135.     assert_equal parsed_expected, JSON.parse(File.read('result.json'))
  136.   end
  137. end
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement