diff --git a/.gitignore b/.gitignore index 8dd09614..3e1eb3ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,36 @@ +coverage capybara*.html +\# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +# Logs and databases # +###################### +*.log +*.sql +*.sqlite +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db diff --git a/Gemfile b/Gemfile index b46d11e9..488966fc 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ gem 'sinatra', require: 'sinatra/base' gem 'pg' gem 'activerecord' gem 'sinatra-activerecord' +gem 'useragent' group :development, :test do gem 'shotgun' @@ -12,4 +13,10 @@ group :development, :test do gem 'capybara' gem 'launchy' gem 'rack-test' + gem 'pry' + gem 'database_cleaner' + gem 'simplecov' + gem 'cane' + gem 'reek' + gem 'rake' end diff --git a/Gemfile.lock b/Gemfile.lock index 05aef662..6ec6a33c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,47 +1,79 @@ GEM remote: https://rubygems.org/ specs: - activemodel (4.2.5.1) - activesupport (= 4.2.5.1) - builder (~> 3.1) - activerecord (4.2.5.1) - activemodel (= 4.2.5.1) - activesupport (= 4.2.5.1) - arel (~> 6.0) - activesupport (4.2.5.1) + activemodel (5.0.0) + activesupport (= 5.0.0) + activerecord (5.0.0) + activemodel (= 5.0.0) + activesupport (= 5.0.0) + arel (~> 7.0) + activesupport (5.0.0) + concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) addressable (2.4.0) - arel (6.0.3) + arel (7.0.0) + ast (2.3.0) + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) bond (0.5.1) - builder (3.2.2) - capybara (2.6.2) + cane (3.0.0) + parallel + capybara (2.7.1) addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) + codeclimate-engine-rb (0.3.1) + virtus (~> 1.0) + coderay (1.1.1) + coercible (1.0.0) + descendants_tracker (~> 0.0.1) + concurrent-ruby (1.0.2) + database_cleaner (1.5.3) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + docile (1.1.5) + equalizer (0.0.11) i18n (0.7.0) - json (1.8.3) + ice_nine (0.11.2) + json (2.0.1) launchy (2.4.3) addressable (~> 2.3) - mime-types (3.0) + method_source (0.8.2) + mime-types (3.1) mime-types-data (~> 3.2015) - mime-types-data (3.2015.1120) - mini_portile2 (2.0.0) - minitest (5.8.4) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) + mime-types-data (3.2016.0521) + mini_portile2 (2.1.0) + minitest (5.9.0) + nokogiri (1.6.8) + mini_portile2 (~> 2.1.0) + pkg-config (~> 1.1.7) + parallel (1.9.0) + parser (2.3.1.2) + ast (~> 2.2) pg (0.18.4) + pkg-config (1.1.7) + pry (0.10.3) + coderay (~> 1.1.0) + method_source (~> 0.8.1) + slop (~> 3.4) rack (1.6.4) rack-protection (1.5.3) rack rack-test (0.6.3) rack (>= 1.0) + rainbow (2.1.0) + rake (11.2.2) + reek (4.1.1) + codeclimate-engine-rb (~> 0.3.1) + parser (~> 2.3.1, >= 2.3.1.2) + rainbow (~> 2.0) ripl (0.7.1) bond (~> 0.5.1) ripl-multi_line (0.3.1) @@ -52,15 +84,21 @@ GEM ripl (>= 0.7.0) shotgun (0.9.1) rack (>= 1.0) + simplecov (0.12.0) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.0) sinatra (1.4.7) rack (~> 1.5) rack-protection (~> 1.4) tilt (>= 1.3, < 3) - sinatra-activerecord (2.0.9) + sinatra-activerecord (2.0.10) activerecord (>= 3.2) sinatra (~> 1.0) + slop (3.6.0) thread_safe (0.3.5) - tilt (2.0.2) + tilt (2.0.5) tux (0.3.0) ripl (>= 0.3.5) ripl-multi_line (>= 0.2.4) @@ -68,6 +106,12 @@ GEM sinatra (>= 1.2.1) tzinfo (1.2.2) thread_safe (~> 0.1) + useragent (0.16.7) + virtus (1.0.5) + axiom-types (~> 0.1) + coercible (~> 1.0) + descendants_tracker (~> 0.0, >= 0.0.3) + equalizer (~> 0.0, >= 0.0.9) xpath (2.0.0) nokogiri (~> 1.3) @@ -76,15 +120,22 @@ PLATFORMS DEPENDENCIES activerecord + cane capybara + database_cleaner launchy minitest pg + pry rack-test + rake + reek shotgun + simplecov sinatra sinatra-activerecord tux + useragent BUNDLED WITH - 1.11.2 + 1.12.3 diff --git a/Rakefile b/Rakefile index 152add3d..73bfc347 100644 --- a/Rakefile +++ b/Rakefile @@ -2,7 +2,15 @@ require "bundler" Bundler.require require "sinatra/activerecord/rake" +require "rake/testtask" +Rake::TestTask.new do |t| + t.libs << "test" + t.test_files = FileList['test/*/*.rb'] + t.verbose = false + t.warning = false +end +task default: :test #<------ important namespace :sanitation do desc "Check line lengths & whitespace with Cane" task :lines do diff --git a/app/models/ip.rb b/app/models/ip.rb new file mode 100644 index 00000000..d8b6652a --- /dev/null +++ b/app/models/ip.rb @@ -0,0 +1,5 @@ +class Ip < ActiveRecord::Base + validates :address, presence: true + + has_many :payload_requests +end diff --git a/app/models/parser.rb b/app/models/parser.rb new file mode 100644 index 00000000..ac4c3a3d --- /dev/null +++ b/app/models/parser.rb @@ -0,0 +1,25 @@ +require 'pry' + +class Parser + + def self.parse_json(json) + JSON.parse(json) + end + + def self.parse_payload(payload) + parsed_json = parse_json(payload) + {"url" => parsed_json["url"], + "requestedAt" => parsed_json["requestedAt"], + "respondedIn" => parsed_json["respondedIn"], + "referredBy" => parsed_json["referredBy"], + "requestType" => parsed_json["requestType"], + "software_agent" => parse_user_agent(parsed_json["userAgent"]), + "resolutionWidth" => parsed_json["resolutionWidth"], + "resolutionHeight" => parsed_json["resolutionHeight"], + "ip" => parsed_json["ip"]} + end + + def self.parse_user_agent(user_agent) + UserAgent.parse(user_agent) + end +end diff --git a/app/models/payload_request.rb b/app/models/payload_request.rb new file mode 100644 index 00000000..fb54f680 --- /dev/null +++ b/app/models/payload_request.rb @@ -0,0 +1,40 @@ +class PayloadRequest < ActiveRecord::Base + + validates :url_id, presence: true + validates :requested_at, presence: true + validates :responded_in, presence: true + validates :referred_by_id, presence: true + validates :request_type_id, presence: true + validates :software_agent_id, presence: true + validates :ip_id, presence: true + validates :resolution_id, presence: true + + belongs_to :url + belongs_to :referrer + belongs_to :request_type + belongs_to :software_agent + belongs_to :resolution + belongs_to :ip + + def referrer + Referrer.find(self.referred_by_id) + end + + def self.find_max_response_by_url(url) + id = Url.find_by_address(url).id + payloads = PayloadRequest.where(url_id: id) + responses = payloads.map do |payload| + payload.responded_in + end + responses.max + end + + def self.find_min_response_by_url(url) + id = Url.find_by_address(url).id + payloads = PayloadRequest.where(url_id: id) + responses = payloads.map do |payload| + payload.responded_in + end + responses.min + end +end diff --git a/app/models/referrer.rb b/app/models/referrer.rb new file mode 100644 index 00000000..2be72606 --- /dev/null +++ b/app/models/referrer.rb @@ -0,0 +1,5 @@ +class Referrer < ActiveRecord::Base + validates :address, presence: true + + has_many :payload_requests +end diff --git a/app/models/request_type.rb b/app/models/request_type.rb new file mode 100644 index 00000000..31cccc20 --- /dev/null +++ b/app/models/request_type.rb @@ -0,0 +1,11 @@ +class RequestType < ActiveRecord::Base + validates :verb, presence: true + + has_many :payload_requests + + def self.most_frequent_type + values = RequestType.pluck(:verb) + values.group_by(&:itself).values.max_by(&:size).first + end + +end diff --git a/app/models/resolution.rb b/app/models/resolution.rb new file mode 100644 index 00000000..e944b75b --- /dev/null +++ b/app/models/resolution.rb @@ -0,0 +1,12 @@ +class Resolution< ActiveRecord::Base + validates :height, presence: true + validates :width, presence:true + + has_many :payload_requests + + def self.all_screen_resolutions_across_all_requests + res = Resolution.pluck(:width, :height) + res.map { |r| r.join(" x ") }.join(", ") + end + +end diff --git a/app/models/software_agent.rb b/app/models/software_agent.rb new file mode 100644 index 00000000..43cb15a4 --- /dev/null +++ b/app/models/software_agent.rb @@ -0,0 +1,22 @@ +class SoftwareAgent < ActiveRecord::Base + + validates :os, presence:true + validates :browser, presence:true + + has_many :payload_requests + + def self.web_browser_breakdown + user_agent_id = PayloadRequest.distinct.pluck(:software_agent_id) + user_agent_id.map do |id| + SoftwareAgent.find(id).browser + end + end + + def self.web_platform_breakdown + software_agent_id = PayloadRequest.distinct.pluck(:software_agent_id) + software_agent_id.map do |id| + SoftwareAgent.find(id).os + end + end + +end diff --git a/app/models/url.rb b/app/models/url.rb new file mode 100644 index 00000000..1b783009 --- /dev/null +++ b/app/models/url.rb @@ -0,0 +1,11 @@ +class Url < ActiveRecord::Base + validates :address, presence:true + + has_many :payload_requests + + def self.urls_from_most_to_least_requested + urls = Url.pluck(:address) + frequency = urls.inject(Hash.new(0)) { |hash , value | hash[value] += 1; hash } + urls.max_by { |value| frequency[value] } + end +end diff --git a/db/migrate/20160706213537_create_payload_requests.rb b/db/migrate/20160706213537_create_payload_requests.rb new file mode 100644 index 00000000..bdce1083 --- /dev/null +++ b/db/migrate/20160706213537_create_payload_requests.rb @@ -0,0 +1,15 @@ +class CreatePayloadRequests < ActiveRecord::Migration + def change + create_table :payload_requests do |t| + t.integer :url_id + t.datetime :requested_at + t.integer :responded_in + t.string :referred_by + t.string :request_type + t.string :user_agent + t.string :resolution_width + t.string :resolution_height + t.string :ip + end + end +end diff --git a/db/migrate/20160706214336_create_urls.rb b/db/migrate/20160706214336_create_urls.rb new file mode 100644 index 00000000..6579a678 --- /dev/null +++ b/db/migrate/20160706214336_create_urls.rb @@ -0,0 +1,7 @@ +class CreateUrls < ActiveRecord::Migration + def change + create_table :urls do |t| + t.string :address + end + end +end diff --git a/db/migrate/20160706221548_create_ip_table.rb b/db/migrate/20160706221548_create_ip_table.rb new file mode 100644 index 00000000..c088556f --- /dev/null +++ b/db/migrate/20160706221548_create_ip_table.rb @@ -0,0 +1,7 @@ +class CreateIpTable < ActiveRecord::Migration + def change + create_table :ips do |t| + t.string :address + end + end +end diff --git a/db/migrate/20160706224821_create_request_types.rb b/db/migrate/20160706224821_create_request_types.rb new file mode 100644 index 00000000..729b9009 --- /dev/null +++ b/db/migrate/20160706224821_create_request_types.rb @@ -0,0 +1,7 @@ +class CreateRequestTypes < ActiveRecord::Migration + def change + create_table :request_types do |t| + t.string :verb + end + end +end diff --git a/db/migrate/20160706230547_create_referrers.rb b/db/migrate/20160706230547_create_referrers.rb new file mode 100644 index 00000000..c7d993f1 --- /dev/null +++ b/db/migrate/20160706230547_create_referrers.rb @@ -0,0 +1,7 @@ +class CreateReferrers < ActiveRecord::Migration + def change + create_table :referrers do |t| + t.string :address + end + end +end diff --git a/db/migrate/20160706231553_create_resolution_table.rb b/db/migrate/20160706231553_create_resolution_table.rb new file mode 100644 index 00000000..fd800fa7 --- /dev/null +++ b/db/migrate/20160706231553_create_resolution_table.rb @@ -0,0 +1,8 @@ +class CreateResolutionTable < ActiveRecord::Migration + def change + create_table :resolutions do |t| + t.string :width + t.string :height + end + end +end diff --git a/db/migrate/20160707031612_fix_data_types_payload_requests.rb b/db/migrate/20160707031612_fix_data_types_payload_requests.rb new file mode 100644 index 00000000..128102ee --- /dev/null +++ b/db/migrate/20160707031612_fix_data_types_payload_requests.rb @@ -0,0 +1,10 @@ +class FixDataTypesPayloadRequests < ActiveRecord::Migration + def change + change_column :payload_requests, :referred_by, 'integer USING CAST(referred_by AS integer)' + change_column :payload_requests, :request_type, 'integer USING CAST(request_type AS integer)' + change_column :payload_requests, :ip, 'integer USING CAST(ip AS integer)' + remove_column(:payload_requests, :resolution_width) + remove_column(:payload_requests, :resolution_height) + add_column(:payload_requests, :resolution_id, :integer) + end +end diff --git a/db/migrate/20160707204237_create_software_agent.rb b/db/migrate/20160707204237_create_software_agent.rb new file mode 100644 index 00000000..daec2627 --- /dev/null +++ b/db/migrate/20160707204237_create_software_agent.rb @@ -0,0 +1,10 @@ +class CreateSoftwareAgent < ActiveRecord::Migration + def change + create_table :software_agent do |t| + t.string :os + t.string :browser + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160707211923_change_names_of_tables_and_columns.rb b/db/migrate/20160707211923_change_names_of_tables_and_columns.rb new file mode 100644 index 00000000..e02320f8 --- /dev/null +++ b/db/migrate/20160707211923_change_names_of_tables_and_columns.rb @@ -0,0 +1,9 @@ +class ChangeNamesOfTablesAndColumns < ActiveRecord::Migration + def change + rename_column :payload_requests, :referred_by, :referred_by_id + rename_column :payload_requests, :user_agent, :software_agent_id + rename_column :payload_requests, :request_type, :request_type_id + rename_column :payload_requests, :ip, :ip_id + rename_table :software_agent, :software_agents + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 00000000..d2f282db --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,57 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20160707211923) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "ips", force: :cascade do |t| + t.string "address" + end + + create_table "payload_requests", force: :cascade do |t| + t.integer "url_id" + t.datetime "requested_at" + t.integer "responded_in" + t.integer "referred_by_id" + t.integer "request_type_id" + t.string "software_agent_id" + t.integer "ip_id" + t.integer "resolution_id" + end + + create_table "referrers", force: :cascade do |t| + t.string "address" + end + + create_table "request_types", force: :cascade do |t| + t.string "verb" + end + + create_table "resolutions", force: :cascade do |t| + t.string "width" + t.string "height" + end + + create_table "software_agents", force: :cascade do |t| + t.string "os" + t.string "browser" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "urls", force: :cascade do |t| + t.string "address" + end + +end diff --git a/test/models/ip_test.rb b/test/models/ip_test.rb new file mode 100644 index 00000000..7eab560f --- /dev/null +++ b/test/models/ip_test.rb @@ -0,0 +1,10 @@ +require_relative '../test_helper' + +class IpTest < Minitest::Test + + def test_it_can_create_url + ip = Ip.create(address: "63.29.38.211") + assert_equal "63.29.38.211", ip.address + end + +end diff --git a/test/models/parser_test.rb b/test/models/parser_test.rb new file mode 100644 index 00000000..679ea7a6 --- /dev/null +++ b/test/models/parser_test.rb @@ -0,0 +1,35 @@ +require_relative '../test_helper' + +class ParserTest < Minitest::Test + + def test_user_agent_gem_parses + user_agent_string = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5' + result = Parser.parse_user_agent(user_agent_string) + + assert_equal "Chrome", result.browser + assert_equal "Macintosh", result.platform + end + + def test_it_can_parse_json + json_string = '{"key": "value"}' + result = Parser.parse_json(json_string) + + assert_equal "value", result["key"] + end + + def test_it_can_parse_a_raw_json_payload + payload = '{"url":"http://jumpstartlab.com/blog","requestedAt":"2013-02-16 21:38:28 -0700","respondedIn":37,"referredBy":"http://jumpstartlab.com","requestType":"GET","parameters":[],"eventName":"socialLogin","userAgent":"Mozilla/5.0 (Macintosh%3B Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17","resolutionWidth":"1920","resolutionHeight":"1280","ip":"63.29.38.211"}' + result = Parser.parse_payload(payload) + + assert_equal "http://jumpstartlab.com/blog", result["url"] + assert_equal "2013-02-16 21:38:28 -0700", result["requestedAt"] + assert_equal 37, result["respondedIn"] + assert_equal "http://jumpstartlab.com", result["referredBy"] + assert_equal "GET", result["requestType"] + assert_equal "Chrome", result["software_agent"].browser + assert_equal "Macintosh%3B Intel Mac OS X 10_8_2", result["software_agent"].platform + assert_equal "1920", result["resolutionWidth"] + assert_equal "1280", result["resolutionHeight"] + end + +end diff --git a/test/models/payload_request_test.rb b/test/models/payload_request_test.rb new file mode 100644 index 00000000..055a66e7 --- /dev/null +++ b/test/models/payload_request_test.rb @@ -0,0 +1,54 @@ +require_relative '../test_helper' +require 'pry' + +class PayloadRequestTest < Minitest::Test + include TestHelpers + + def test_it_creates_a_payload_request_with_valid_attributes + create_payload(1) + payload = PayloadRequest.find(1) + + assert_equal 1, payload.id + assert_equal 1, payload.resolution_id + assert_equal 1, payload.referred_by_id + assert_equal "http://jumpstartlab.com/blog0", payload.url.address + assert_equal "http://jumpstartlab.com0", payload.referrer.address + assert_equal "GET 0", payload.request_type.verb + assert_equal "Chrome0", payload.software_agent.browser + assert_equal "OSX 10.11.50", payload.software_agent.os + assert_equal "19200", payload.resolution.width + assert_equal "12800", payload.resolution.height + assert_equal 0, payload.responded_in + assert_equal "63.29.38.2110", payload.ip.address +end + + def test_find_average + create_payload(3) + + assert_equal 1, PayloadRequest.average(:responded_in).to_i + end + + def test_max_response_time + create_payload(3) + + assert_equal 2, PayloadRequest.maximum(:responded_in) + end + + def test_min_response_time + create_payload(3) + + assert_equal 0, PayloadRequest.minimum(:responded_in) + end + + def test_find_max_response_by_url + create_payload(3) + + assert_equal 0, PayloadRequest.find_max_response_by_url("http://jumpstartlab.com/blog0") + end + + def test_find_min_response_by_url + create_payload(3) + + assert_equal 0, PayloadRequest.find_min_response_by_url("http://jumpstartlab.com/blog0") + end +end diff --git a/test/models/referrer_test.rb b/test/models/referrer_test.rb new file mode 100644 index 00000000..5f4c3706 --- /dev/null +++ b/test/models/referrer_test.rb @@ -0,0 +1,9 @@ +require_relative '../test_helper' + +class ReferrerTest < Minitest::Test + + def test_it_can_create_referrer + website = Referrer.create(address:"google.com") + assert_equal "google.com", website.address + end +end diff --git a/test/models/request_type_test.rb b/test/models/request_type_test.rb new file mode 100644 index 00000000..0f3007bd --- /dev/null +++ b/test/models/request_type_test.rb @@ -0,0 +1,27 @@ +require_relative '../test_helper' + +class RequestTypeTest < Minitest::Test + include TestHelpers + + def test_it_can_create_request_type + type = RequestType.create(verb: "GET") + assert_equal "GET", type.verb + end + + def test_most_common_type_of_request + RequestType.create(verb: "GET") + RequestType.create(verb: "GET") + RequestType.create(verb: "GET") + RequestType.create(verb: "POST") + assert_equal "GET", RequestType.most_frequent_type + end + + def test_list_of_http_verbs_used + RequestType.create(verb: "GET") + RequestType.create(verb: "GET") + RequestType.create(verb: "GET") + RequestType.create(verb: "POST") + assert_equal ["GET", "GET", "GET", "POST"], RequestType.pluck(:verb) + end + +end diff --git a/test/models/resolution_test.rb b/test/models/resolution_test.rb new file mode 100644 index 00000000..7460ae72 --- /dev/null +++ b/test/models/resolution_test.rb @@ -0,0 +1,22 @@ +require_relative '../test_helper' + +class ResolutionTest < Minitest::Test + include TestHelpers + + def test_it_can_create_resolution + res = Resolution.create(height: "15px", width:"20px") + + assert_equal "15px", res.height + assert_equal "20px", res.width + end + + def test_all_screen_resolutions_across_all_requests + res = Resolution.create(height: "1366px", width:"768px") + res = Resolution.create(height: "1920px", width:"1080px") + res = Resolution.create(height: "1280px", width:"80px") + res = Resolution.create(height: "320px", width:"568px") + + expected = "768px x 1366px, 1080px x 1920px, 80px x 1280px, 568px x 320px" + assert_equal expected, Resolution.all_screen_resolutions_across_all_requests + end +end diff --git a/test/models/software_agent_test.rb b/test/models/software_agent_test.rb new file mode 100644 index 00000000..3ea709af --- /dev/null +++ b/test/models/software_agent_test.rb @@ -0,0 +1,23 @@ +require_relative '../test_helper' + +class SoftwareAgentTest < Minitest::Test + include TestHelpers + + def test_it_creates_user_agent + user_agent = create_software_agent + assert user_agent.valid? + + assert_equal "OS X 10.8.2", software_agent.os + assert_equal "Chrome", software_agent.browser + end + + def test_browser_breakdown_returns_browser_with_count + create_payload(2) + assert_equal ["Chrome1", "Chrome0"], SoftwareAgent.web_browser_breakdown + end + + def test_platform_breakdown_returns_platform_with_count + create_payload(2) + assert_equal ["OSX 10.11.51", "OSX 10.11.50"], SoftwareAgent.web_platform_breakdown + end +end diff --git a/test/models/url_test.rb b/test/models/url_test.rb new file mode 100644 index 00000000..75332eb9 --- /dev/null +++ b/test/models/url_test.rb @@ -0,0 +1,22 @@ +require_relative '../test_helper' + +class UrlTest < Minitest::Test + include TestHelpers + + def test_it_can_create_url + url = Url.create(address:"Turing.io") + assert_equal "Turing.io", url.address + end + + def test_urls_from_most_requested_to_least_requested + url = Url.create(address:"http://www.turing.io") + url = Url.create(address:"http://www.turing.io") + url = Url.create(address:"http://www.foragoodstrftime.com/") + url = Url.create(address:"http://www.foragoodstrftime.com/") + url = Url.create(address:"http://www.turing.io") + url = Url.create(address:"http://www.galvanize.com") + + expected = "http://www.turing.io" + assert_equal expected, Url.urls_from_most_to_least_requested + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 447449ed..1bd1b0c3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,8 @@ ENV["RACK_ENV"] ||= "test" +require 'simplecov' +SimpleCov.start + require 'bundler' Bundler.require @@ -7,5 +10,54 @@ require 'minitest/autorun' require 'minitest/pride' require 'capybara/dsl' +require 'database_cleaner' +require 'useragent' +DatabaseCleaner.strategy = :truncation Capybara.app = RushHour::Server + +module TestHelpers + def setup + DatabaseCleaner.start + super + end + + def software_agent(path = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17") + UserAgent.parse(path) + end + + def create_software_agent + SoftwareAgent.create( + browser: software_agent.browser, + os: software_agent.platform + ) + end + + def create_payload(integer) + integer.times do |i| + url = Url.create(address: "http://jumpstartlab.com/blog#{i}") + requested_at = Time.now + request_type = RequestType.create(verb: "GET #{i}") + resolution = Resolution.create(width: "1920#{i}", height: "1280#{i}") + referrer = Referrer.create(address: "http://jumpstartlab.com#{i}") + software_agent = SoftwareAgent.create(os: "OSX 10.11.5#{i}", browser: "Chrome#{i}") + ip = Ip.create(address: "63.29.38.211#{i}") + + PayloadRequest.find_or_create_by({ + :url_id => url.id, + :requested_at => requested_at, + :responded_in => i, + :request_type_id => request_type.id, + :resolution_id => resolution.id, + :referred_by_id => referrer.id, + :software_agent_id => software_agent.id, + :ip_id => ip.id }) + end + end + + def teardown + DatabaseCleaner.clean + super + end + +end