Merge pull request #74 from ENSL/develop

Develop
This commit is contained in:
simplefl 2015-11-09 09:50:27 +01:00
commit e6138d72ec
35 changed files with 328 additions and 308 deletions

View file

@ -156,6 +156,7 @@ div#match {
.team-1, .team-1,
.team-2 { .team-2 {
position: relative; position: relative;
margin-bottom: 20px;
.player { .player {
@include span-columns(12); @include span-columns(12);
@ -167,21 +168,8 @@ div#match {
position: relative; position: relative;
} }
.controls { label.checkbox {
top: 0; padding: 0;
position: absolute;
z-index: 100;
input {
margin: 0;
}
}
form {
label.checkbox {
padding: 0;
}
} }
} }
@ -193,16 +181,9 @@ div#match {
margin: 0 0 0 10px; margin: 0 0 0 10px;
} }
.controls { label.checkbox {
left: 0; float: right;
} margin-left: 1em;
form {
label.checkbox {
float: right;
margin-left: 1em;
}
} }
} }
@ -210,16 +191,9 @@ div#match {
@include span-columns(6); @include span-columns(6);
@include omega; @include omega;
.controls { label.checkbox {
right: 0; float: left;
} margin-right: 1em;
form {
label.checkbox {
float: left;
margin-right: 1em;
}
} }
} }
@ -234,6 +208,10 @@ div#match {
margin: 0; margin: 0;
} }
} }
form .controls {
clear: both;
}
} }
.scoring { .scoring {

48
app/assets/stylesheets/themes/flat/pages/_matches.scss Normal file → Executable file
View file

@ -155,6 +155,7 @@ div#match {
.team-1, .team-1,
.team-2 { .team-2 {
position: relative; position: relative;
margin-bottom: 20px;
.player { .player {
@include span-columns(12); @include span-columns(12);
@ -166,21 +167,8 @@ div#match {
position: relative; position: relative;
} }
.controls { label.checkbox {
top: 0; padding: 0;
position: absolute;
z-index: 100;
input {
margin: 0;
}
}
form {
label.checkbox {
padding: 0;
}
} }
} }
@ -192,16 +180,9 @@ div#match {
margin: 0 0 0 10px; margin: 0 0 0 10px;
} }
.controls { label.checkbox {
left: 0; float: right;
} margin-left: 1em;
form {
label.checkbox {
float: right;
margin-left: 1em;
}
} }
} }
@ -209,16 +190,9 @@ div#match {
@include span-columns(6); @include span-columns(6);
@include omega; @include omega;
.controls { label.checkbox {
right: 0; float: left;
} margin-right: 1em;
form {
label.checkbox {
float: left;
margin-right: 1em;
}
} }
} }
@ -233,6 +207,10 @@ div#match {
margin: 0; margin: 0;
} }
} }
form .controls {
clear: both;
}
} }
.scoring { .scoring {

View file

@ -6,7 +6,7 @@ class MatchesController < ApplicationController
end end
def show def show
@ownpred = @match.predictions.first conditions: {user_id: cuser.id} if cuser @ownpred = @match.predictions.first conditions: { user_id: cuser.id } if cuser
@newpred = @match.predictions.build @newpred = @match.predictions.build
end end
@ -17,8 +17,9 @@ class MatchesController < ApplicationController
end end
def admin def admin
@matches = Match.active.includes(:contest, :contester1, :contester2, :map1, :map2, :referee).all.group_by {|t| t.week.to_s }.to_a.reverse @matches = Match.active.includes(:contest, :contester1, :contester2, :map1, :map2, :referee)
render :layout => "full" .all.group_by { |t| t.week.to_s }.to_a.reverse
render layout: "full"
end end
def extra def extra
@ -39,7 +40,7 @@ class MatchesController < ApplicationController
if @match.save if @match.save
flash[:notice] = t(:matches_create) flash[:notice] = t(:matches_create)
redirect_to controller: 'contests', action: 'edit', id: @match.contest redirect_to edit_contest_path(@match.contest)
else else
render :new render :new
end end
@ -49,11 +50,11 @@ class MatchesController < ApplicationController
raise AccessError unless @match.can_update? cuser, params[:match] raise AccessError unless @match.can_update? cuser, params[:match]
if params[:match][:matchers_attributes] if params[:match][:matchers_attributes]
params[:match][:matchers_attributes].each do |key, matcher| params[:match][:matchers_attributes].each do |key, matcher|
matcher['_destroy'] = matcher['_destroy'] == "keep" ? false : true matcher["_destroy"] = matcher["_destroy"] == "keep" ? false : true
if matcher['user_id'] == "" if matcher["user_id"] == ""
params[:match][:matchers_attributes].delete key params[:match][:matchers_attributes].delete key
elsif matcher['user_id'].to_i == 0 elsif matcher["user_id"].to_i == 0
matcher['user_id'] = User.find_by_username(matcher['user_id']).id matcher["user_id"] = User.find_by_username(matcher["user_id"]).id
end end
end end
end end
@ -71,7 +72,12 @@ class MatchesController < ApplicationController
end end
end end
else else
render :edit if URI(request.referer).path == match_ref_path(@match)
ref
render :ref
else
render :edit
end
end end
end end
@ -90,13 +96,13 @@ class MatchesController < ApplicationController
@match.hltv_stop @match.hltv_stop
flash[:notice] = t(:hltv_stopped) flash[:notice] = t(:hltv_stopped)
end end
redirect_to action: 'show' redirect_to action: "show"
end end
def destroy def destroy
raise AccessError unless @match.can_destroy? cuser raise AccessError unless @match.can_destroy? cuser
@match.destroy @match.destroy
redirect_to controller: 'contests', action: 'edit', id: @match.contest redirect_to edit_contest_path(@match.contest)
end end
private private

View file

@ -193,7 +193,7 @@ class Match < ActiveRecord::Base
end end
def send_notifications def send_notifications
Profile.all(include: :user, conditions: "notify_any_match = 1").find_each do |p| Profile.includes(:user).where(notify_any_match: 1).find_each do |p|
Notifications.match p.user, self if p.user Notifications.match p.user, self if p.user
end end
contester2.team.teamers.active.each do |teamer| contester2.team.teamers.active.each do |teamer|

6
app/views/matches/_lineup.html.erb Normal file → Executable file
View file

@ -1,7 +1,7 @@
<div class="players"> <div class="players">
<% contester.lineup.each do |teamer| %> <% contester.lineup.each do |teamer| %>
<div class="player fields"> <div class="player fields">
<% if matcher = @match.matchers.first(conditions: { user_id: teamer.user_id }) %> <% if matcher = @match.matchers.first(conditions: { user_id: teamer.user_id, contester_id: contester.id }) %>
<%= hidden_field_tag "match[matchers_attributes][#{@n}][id]", matcher.id %> <%= hidden_field_tag "match[matchers_attributes][#{@n}][id]", matcher.id %>
<% end %> <% end %>
@ -9,7 +9,7 @@
<%= hidden_field_tag "match[matchers_attributes][#{@n}][contester_id]", contester.id %> <%= hidden_field_tag "match[matchers_attributes][#{@n}][contester_id]", contester.id %>
<%= hidden_field_tag "match[matchers_attributes][#{@n}][match_id]", @match.id %> <%= hidden_field_tag "match[matchers_attributes][#{@n}][match_id]", @match.id %>
<%= hidden_field_tag "match[matchers_attributes][#{@n}][merc]", false %> <%= hidden_field_tag "match[matchers_attributes][#{@n}][merc]", false %>
<%= check_box_tag "match[matchers_attributes][#{@n}][_destroy]", "keep", @match.users.exists?(teamer.user), { id: "player_#{@n}" } %> <%= check_box_tag "match[matchers_attributes][#{@n}][_destroy]", "keep", !matcher.nil?, { id: "player_#{@n}" } %>
<%= label_tag "player_#{@n}", '', class: 'checkbox' %> <%= label_tag "player_#{@n}", '', class: 'checkbox' %>
@ -45,5 +45,7 @@
<%= hidden_field_tag "match[matchers_attributes][#{@n}][_destroy]", "keep" %> <%= hidden_field_tag "match[matchers_attributes][#{@n}][_destroy]", "keep" %>
<%= text_field_tag "match[matchers_attributes][#{@n}][user_id]", '', placeholder: 'Mercenary' %> <%= text_field_tag "match[matchers_attributes][#{@n}][user_id]", '', placeholder: 'Mercenary' %>
<% @n = @n + 1 %>
</div> </div>
</div> </div>

38
app/views/matches/ref.html.erb Normal file → Executable file
View file

@ -16,33 +16,25 @@
<div class="lineups"> <div class="lineups">
<h3>Lineups</h3> <h3>Lineups</h3>
<div class="team-1"> <%= form_for @match do |f| %>
<%= form_for @match do |f| %> <%= f.error_messages %>
<%= f.error_messages %>
<div class="controls">
<%= f.submit 'Save Lineup' %>
</div>
<div class="team-1">
<% [@match.contester1].each do |contester| %> <% [@match.contester1].each do |contester| %>
<%= render partial: "lineup", locals: { contester: contester } %> <%= render partial: "lineup", locals: { contester: contester } %>
<% end %> <% end %>
<% end %> </div>
</div>
<div class="team-2">
<div class="team-2">
<%= form_for @match do |f| %>
<%= f.error_messages %>
<div class="controls">
<%= f.submit 'Save Lineup' %>
</div>
<% [@match.contester2].each do |contester| %> <% [@match.contester2].each do |contester| %>
<%= render partial: "lineup", locals: { contester: contester } %> <%= render partial: "lineup", locals: { contester: contester } %>
<% end %> <% end %>
<% end %> </div>
</div>
<div class="controls">
<%= f.submit 'Save Lineups' %>
</div>
<% end %>
</div> </div>
<div class="scoring"> <div class="scoring">
@ -83,7 +75,7 @@
</div> </div>
<div class="controls"> <div class="controls">
<%= f.submit 'Save Scores' %> <%= f.submit 'Save Scoring' %>
</div> </div>
<% end %> <% end %>
</div> </div>

4
app/views/matches/show.html.erb Normal file → Executable file
View file

@ -117,9 +117,9 @@
</div> </div>
<% end %> <% end %>
<% if cuser and @match.can_update? cuser, referee_id: cuser.id %> <% if cuser and @match.can_update? cuser, [:report] %>
<div class="referee"> <div class="referee">
<%= link_to "Referee Admin", { controller: :matches, action: 'ref', id: @match }, class: 'button' %> <%= link_to "Referee Admin", match_ref_path(@match), class: 'button' %>
</div> </div>
<% end %> <% end %>
</div> </div>

109
config/routes.rb Normal file → Executable file
View file

@ -1,6 +1,6 @@
Ensl::Application.routes.draw do Ensl::Application.routes.draw do
%w(403 404 422 500).each do |code| %w(403 404 422 500).each do |code|
get code, to: 'errors#show', code: code get code, to: "errors#show", code: code
end end
namespace :api do namespace :api do
@ -17,12 +17,12 @@ Ensl::Application.routes.draw do
resources :versions resources :versions
end end
match 'contests/del_map' match "contests/del_map"
match 'contests/scores' match "contests/scores"
match 'contests/historical', to: "contests#historical" match "contests/historical", to: "contests#historical"
resources :contests do resources :contests do
get 'current', on: :collection get "current", on: :collection
end end
resources :log_events resources :log_events
@ -30,7 +30,7 @@ Ensl::Application.routes.draw do
resources :options resources :options
resources :polls resources :polls
match 'comments/quote' match "comments/quote"
resources :comments resources :comments
resources :shoutmsgs resources :shoutmsgs
@ -43,8 +43,8 @@ Ensl::Application.routes.draw do
resources :forumers resources :forumers
resources :topics resources :topics
match 'forums/up' match "forums/up"
match 'forums/down' match "forums/down"
resources :forums resources :forums
resources :users resources :users
@ -55,9 +55,10 @@ Ensl::Application.routes.draw do
resources :servers resources :servers
resources :predictions resources :predictions
resources :rounds resources :rounds
resources :matches do |m|
get "matches/ref/:id" => "matches#ref", as: :match_ref
resources :matches do
get :admin, to: "matches#admin", on: :collection get :admin, to: "matches#admin", on: :collection
get :ref, to: "matches#ref"
end end
resources :maps resources :maps
@ -73,66 +74,66 @@ Ensl::Application.routes.draw do
resources :bans resources :bans
resources :tweets resources :tweets
resources :issues resources :issues
match 'posts/quote' match "posts/quote"
resources :posts resources :posts
resources :brackets resources :brackets
match 'about/action' match "about/action"
match 'about/staff' match "about/staff"
match 'about/statistics' match "about/statistics"
match 'refresh', to: "application#refresh" match "refresh", to: "application#refresh"
match 'search', to: "application#search" match "search", to: "application#search"
match 'news', to: "articles#news_index" match "news", to: "articles#news_index"
match 'news/archive', to: "articles#news_archive" match "news/archive", to: "articles#news_archive"
match 'news/admin', to: "articles#admin" match "news/admin", to: "articles#admin"
match 'articles/cleanup' match "articles/cleanup"
match 'data_files/admin' match "data_files/admin"
match 'data_files/addFile' match "data_files/addFile"
match 'data_files/delFile' match "data_files/delFile"
match 'data_files/trash' match "data_files/trash"
match 'contesters/recalc' match "contesters/recalc"
match 'directories', to: "directories#show", id: 1 match "directories", to: "directories#show", id: 1
match 'gathers/refresh' match "gathers/refresh"
match 'gathers/latest/:game', to: "gathers#latest", via: :get match "gathers/latest/:game", to: "gathers#latest", via: :get
match 'gather', to: "gathers#latest", game: "ns2", via: :get match "gather", to: "gathers#latest", game: "ns2", via: :get
match 'gatherers/:id/status', to: "gatherers#status", via: :post match "gatherers/:id/status", to: "gatherers#status", via: :post
match 'groups/addUser' match "groups/addUser"
match 'groups/delUser' match "groups/delUser"
match 'movies/download' match "movies/download"
match 'movies/preview' match "movies/preview"
match 'movies/snapshot' match "movies/snapshot"
match 'plugin/user' match "plugin/user"
match 'users/forgot' match "users/forgot"
match 'users/recover' match "users/recover"
match 'users/agenda' match "users/agenda"
match 'users/logout' match "users/logout"
match 'users/login' match "users/login"
match 'users/agenda' match "users/agenda"
match 'users/login' match "users/login"
match 'users/logout' match "users/logout"
match 'users/popup' match "users/popup"
match 'users/forgot', to: "users#forgot" match "users/forgot", to: "users#forgot"
match 'votes/create' match "votes/create"
match ':controller/:action', requirements: { action: /A-Za-z/ } match ":controller/:action", requirements: { action: /A-Za-z/ }
match ':controller/:action/:id' match ":controller/:action/:id"
match ':controller/:action/:id.:format' match ":controller/:action/:id.:format"
match ':controller/:action/:id/:id2' match ":controller/:action/:id/:id2"
match 'teamers/replace', to: 'teamers#replace', as: 'teamers_replace' match "teamers/replace", to: "teamers#replace", as: "teamers_replace"
end end

View file

@ -13,6 +13,14 @@ Style/CollectionMethods:
find: detect find: detect
find_all: select find_all: select
reduce: inject reduce: inject
Style/DotPosition:
Description: Checks the position of the dot in multi-line method calls.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains
Enabled: true
EnforcedStyle: leading
SupportedStyles:
- leading
- trailing
Style/FileName: Style/FileName:
Description: Use snake_case for source file names. Description: Use snake_case for source file names.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
@ -27,7 +35,7 @@ Style/IfUnlessModifier:
Description: Favor modifier if/unless usage when you have a single-line body. Description: Favor modifier if/unless usage when you have a single-line body.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
Enabled: false Enabled: false
MaxLineLength: 80 MaxLineLength: 100
Style/OptionHash: Style/OptionHash:
Description: Don't use option hashes when you can use keyword arguments. Description: Don't use option hashes when you can use keyword arguments.
Enabled: false Enabled: false
@ -223,14 +231,11 @@ Lint/LiteralInCondition:
Lint/LiteralInInterpolation: Lint/LiteralInInterpolation:
Description: Checks for literals used in interpolation. Description: Checks for literals used in interpolation.
Enabled: false Enabled: false
Metrics/LineLength: Metrics/LineLength:
Description: Limit lines to 100 characters. Description: Limit lines to 100 characters.
StyleGuide: https://github.com/bbatsov/ruby-style-guide#80-character-limits
Enabled: true Enabled: true
Max: 100 Max: 100
AllowURI: true AllowURI: true
URISchemes: URISchemes:
- http - http
- https - https

View file

@ -54,8 +54,9 @@ module Verification
end end
# TODO: rikki? # TODO: rikki?
# Returns true if params (or its keys) are a subset of filter # Returns true if params (or its keys if a hash) are a subset of filter
def self.contain(params, filter) def self.contain(params, filter)
((params.instance_of?(Array) ? params : params.keys) - filter).empty? keys = (params.instance_of?(Array) ? params : params.keys).map(&:to_sym)
(keys - filter).empty?
end end
end end

14
spec/controllers/api/v1/maps_controller_spec.rb Normal file → Executable file
View file

@ -1,19 +1,19 @@
require 'spec_helper' require "spec_helper"
describe Api::V1::MapsController do describe Api::V1::MapsController do
before do before do
request.accept = 'application/json' request.accept = "application/json"
end end
describe '#index' do describe "#index" do
let!(:map) { create :map } let!(:map) { create :map }
it 'returns a list of maps' do it "returns a list of maps" do
get :index get :index
expect(response).to be_success expect(response).to be_success
expect(json['maps'].length).to eq(1) expect(json["maps"].length).to eq(1)
json_map = json['maps'][0] json_map = json["maps"][0]
expect(json_map['id']).to eq(map.id) expect(json_map["id"]).to eq(map.id)
end end
end end
end end

14
spec/controllers/api/v1/servers_controller_spec.rb Normal file → Executable file
View file

@ -1,20 +1,20 @@
require 'spec_helper' require "spec_helper"
describe Api::V1::ServersController do describe Api::V1::ServersController do
before do before do
request.accept = 'application/json' request.accept = "application/json"
end end
describe '#index' do describe "#index" do
let!(:server) { create :server, :active } let!(:server) { create :server, :active }
let!(:inactive_server) { create :server, :inactive } let!(:inactive_server) { create :server, :inactive }
it 'returns a list of servers' do it "returns a list of servers" do
get :index get :index
expect(response).to be_success expect(response).to be_success
expect(json['servers'].length).to eq(1) expect(json["servers"].length).to eq(1)
json_server = json['servers'][0] json_server = json["servers"][0]
expect(json_server['id']).to eq(server.id) expect(json_server["id"]).to eq(server.id)
end end
end end
end end

14
spec/controllers/plugin/plugin_controller_spec.rb Normal file → Executable file
View file

@ -1,9 +1,9 @@
require 'spec_helper' require "spec_helper"
describe PluginController do describe PluginController do
render_views render_views
describe '#user' do describe "#user" do
before do before do
create :group, :donors create :group, :donors
create :group, :champions create :group, :champions
@ -11,19 +11,19 @@ describe PluginController do
let!(:user) { create :user_with_team } let!(:user) { create :user_with_team }
it 'returns user data' do it "returns user data" do
get :user, id: user.steamid get :user, id: user.steamid
expect(response).to be_success expect(response).to be_success
expect(response.body).to include(user.username) expect(response.body).to include(user.username)
end end
it 'definitely does not return IP address' do it "definitely does not return IP address" do
last_ip = '127.0.0.1' last_ip = "127.0.0.1"
user.lastip = last_ip user.lastip = last_ip
user.save! user.save!
get :user, id: user.steamid get :user, id: user.steamid
expect(response).to be_success expect(response).to be_success
expect(response).to_not include(last_ip) expect(response).to_not include(last_ip)
end end
end end
end end

4
spec/factories/article.rb Normal file → Executable file
View file

@ -1,6 +1,6 @@
FactoryGirl.define do FactoryGirl.define do
factory :article do factory :article do
sequence(:title) { |n| "Article #{n}" } sequence(:title) { |n| "Article #{n}" }
sequence(:text) { |n| (0..100).map{ (0...8).map { (65 + rand(26)).chr }.join }.join(" ") } sequence(:text) { (0..100).map { (0...8).map { (65 + rand(26)).chr }.join }.join(" ") }
end end
end end

6
spec/factories/ban.rb Normal file → Executable file
View file

@ -1,13 +1,13 @@
FactoryGirl.define do FactoryGirl.define do
factory :ban do factory :ban do
ban_type Ban::TYPE_SITE ban_type Ban::TYPE_SITE
expiry Date.today + 1 expiry Time.now.utc.to_date + 1
# Hack because of the awkward way bans are created (requires user_name) # Hack because of the awkward way bans are created (requires user_name)
before(:create) do |ban| before(:create) do |ban|
if ban.user.nil? if ban.user.nil?
user = create :user user = create :user
ban.user_name = user.username ban.user_name = user.username
else else
ban.user_name = ban.user.username ban.user_name = ban.user.username
end end
end end
@ -28,4 +28,4 @@ FactoryGirl.define do
trait :expired do trait :expired do
expiry Date.yesterday - 1 expiry Date.yesterday - 1
end end
end end

6
spec/factories/category.rb Normal file → Executable file
View file

@ -5,10 +5,10 @@ FactoryGirl.define do
end end
trait :news do trait :news do
domain Category::DOMAIN_NEWS domain Category::DOMAIN_NEWS
end end
trait :game do trait :game do
domain Category::DOMAIN_GAMES domain Category::DOMAIN_GAMES
end end
end end

10
spec/factories/contest.rb Executable file
View file

@ -0,0 +1,10 @@
FactoryGirl.define do
factory :contest do
sequence(:name) { |n| "Contest ##{n}" }
start Date.yesterday
self.end Date.tomorrow
status Contest::STATUS_PROGRESS
default_time "12:00:00"
end
end

8
spec/factories/contester.rb Executable file
View file

@ -0,0 +1,8 @@
FactoryGirl.define do
factory :contester do
contest
team do
create(:user_with_team).team
end
end
end

4
spec/factories/gather.rb Normal file → Executable file
View file

@ -4,10 +4,10 @@ FactoryGirl.define do
end end
trait :running do trait :running do
status Gather::STATE_RUNNING status Gather::STATE_RUNNING
end end
trait :picking do trait :picking do
status Gather::STATE_PICKING status Gather::STATE_PICKING
end end
end end

26
spec/factories/group.rb Normal file → Executable file
View file

@ -1,27 +1,39 @@
FactoryGirl.define do FactoryGirl.define do
factory :group do factory :group do
sequence(:id) { |n| n + 100 } # Preserve first 100 sequence(:id) { |n| n + 100 } # Preserve first 100
sequence(:name) { |n| "Group#{n}" } sequence(:name) { |n| "Group#{n}" }
association :founder, factory: :user association :founder, factory: :user
initialize_with { Group.find_or_create_by_id(id) }
end end
trait :admin do trait :admin do
name "Admins" name "Admins"
id Group::ADMINS id Group::ADMINS
end
trait :caster do
name "Shoutcasters"
id Group::CASTERS
end end
trait :champions do trait :champions do
name "Champions" name "Champions"
id Group::CHAMPIONS id Group::CHAMPIONS
end end
trait :donors do trait :donors do
name "Donors" name "Donors"
id Group::DONORS id Group::DONORS
end end
trait :gather_moderator do trait :gather_moderator do
name "Gather Moderator" name "Gather Moderator"
id Group::GATHER_MODERATORS id Group::GATHER_MODERATORS
end end
trait :ref do
name "Referees"
id Group::REFEREES
end
end end

8
spec/factories/grouper.rb Normal file → Executable file
View file

@ -1,5 +1,5 @@
FactoryGirl.define do FactoryGirl.define do
factory :grouper do factory :grouper do
sequence(:task) { |n| "Task#{n}" } sequence(:task) { |n| "Task#{n}" }
end end
end end

14
spec/factories/issue.rb Normal file → Executable file
View file

@ -1,8 +1,8 @@
FactoryGirl.define do FactoryGirl.define do
factory :issue do factory :issue do
sequence(:title) { |n| "Issue title #{n}" } sequence(:title) { |n| "Issue title #{n}" }
sequence(:text) { |n| "Issue Text #{n}" } sequence(:text) { |n| "Issue Text #{n}" }
status Issue::STATUS_OPEN status Issue::STATUS_OPEN
association :author, factory: :user association :author, factory: :user
end end
end end

13
spec/factories/match.rb Executable file
View file

@ -0,0 +1,13 @@
FactoryGirl.define do
factory :match do
contest
contester1 do
create(:contester, contest: contest)
end
contester2 do
create(:contester, contest: contest)
end
match_time 1.hour.from_now
end
end

16
spec/factories/message.rb Normal file → Executable file
View file

@ -1,9 +1,9 @@
FactoryGirl.define do FactoryGirl.define do
factory :message do factory :message do
association :sender, factory: :user association :sender, factory: :user
association :recipient, factory: :user association :recipient, factory: :user
sequence(:text) { |n| "text-#{n}" } sequence(:text) { |n| "text-#{n}" }
sequence(:title) { |n| "title-#{n}" } sequence(:title) { |n| "title-#{n}" }
sequence(:text_parsed) { |n| "text-#{n}" } sequence(:text_parsed) { |n| "text-#{n}" }
end end
end end

2
spec/factories/server.rb Normal file → Executable file
View file

@ -13,4 +13,4 @@ FactoryGirl.define do
active false active false
end end
end end
end end

4
spec/factories/team.rb Normal file → Executable file
View file

@ -1,11 +1,11 @@
FactoryGirl.define do FactoryGirl.define do
factory :team do factory :team do
sequence(:name) { |n| "Team ##{n}" } sequence(:name) { |n| "Team ##{n}" }
irc "#team" irc "#team"
web "http://team.com" web "http://team.com"
tag "[TEAM]" tag "[TEAM]"
country "EU" country "EU"
comment "We are a team" comment "We are a team"
end end
end end

14
spec/factories/user.rb Normal file → Executable file
View file

@ -20,6 +20,20 @@ FactoryGirl.define do
end end
end end
trait :caster do
after(:create) do |user|
group = create(:group, :caster)
create :grouper, user: user, group: group
end
end
trait :ref do
after(:create) do |user|
group = create(:group, :ref)
create :grouper, user: user, group: group
end
end
trait :chris do trait :chris do
steamid "0:1:58097444" steamid "0:1:58097444"
end end

58
spec/features/shoutbox/shoutbox_spec.rb Normal file → Executable file
View file

@ -1,34 +1,34 @@
require 'spec_helper' require "spec_helper"
feature 'Shoutbox', js: true do feature "Shoutbox", js: true do
let!(:user) { create :user } let!(:user) { create :user }
background do background do
sign_in_as user sign_in_as user
end end
scenario 'creating a valid shout' do scenario "creating a valid shout" do
visit root_path visit root_path
shout = rand(100000).to_s shout = rand(100_000).to_s
fill_in 'shoutbox_text', with: shout fill_in "shoutbox_text", with: shout
click_button 'Shout!' click_button "Shout!"
expect(page).to have_content(shout) expect(page).to have_content(shout)
end end
scenario 'enter more than 100 characters' do scenario "enter more than 100 characters" do
valid_shout = 100.times.map { "a" }.join valid_shout = 100.times.map { "a" }.join
invalid_shout = 101.times.map { "a" }.join invalid_shout = 101.times.map { "a" }.join
visit root_path visit root_path
expect(page).to_not have_content("Maximum shout length exceeded") expect(page).to_not have_content("Maximum shout length exceeded")
fill_in 'shoutbox_text', with: invalid_shout fill_in "shoutbox_text", with: invalid_shout
expect(page).to have_content("Maximum shout length exceeded") expect(page).to have_content("Maximum shout length exceeded")
fill_in 'shoutbox_text', with: valid_shout fill_in "shoutbox_text", with: valid_shout
expect(page).to_not have_content("Maximum shout length exceeded") expect(page).to_not have_content("Maximum shout length exceeded")
end end
scenario 'creating shout while banned' do scenario "creating shout while banned" do
Ban.create! ban_type: Ban::TYPE_MUTE, expiry: Time.now + 10.days, user_name: user.username Ban.create! ban_type: Ban::TYPE_MUTE, expiry: Time.now.utc + 10.days, user_name: user.username
visit root_path visit root_path
expect(find("#sidebar")).to have_content "You have been muted." expect(find("#sidebar")).to have_content "You have been muted."
end end
end end

22
spec/features/users/case_insensitive_login_spec.rb Normal file → Executable file
View file

@ -1,6 +1,6 @@
require 'spec_helper' require "spec_helper"
feature 'Case insensitive login', js: :true do feature "Case insensitive login", js: :true do
let(:username) { "CaSe_InSeNsItIvE" } let(:username) { "CaSe_InSeNsItIvE" }
let(:password) { "passwordABC123" } let(:password) { "passwordABC123" }
let!(:user) { create(:user, username: username, raw_password: password) } let!(:user) { create(:user, username: username, raw_password: password) }
@ -9,23 +9,23 @@ feature 'Case insensitive login', js: :true do
visit root_path visit root_path
end end
feature 'when a user with mixed-case username signs in' do feature "when a user with mixed-case username signs in" do
scenario 'with a matching case allows the user to sign in' do scenario "with a matching case allows the user to sign in" do
fill_login_form(username) fill_login_form(username)
click_button submit(:user, :login) click_button submit(:user, :login)
expect(page).to have_content(I18n.t('login_successful')) expect(page).to have_content(I18n.t("login_successful"))
within user_status do within user_status do
expect(page).to have_content(account_link) expect(page).to have_content(account_link)
end end
end end
scenario 'with a non-matching case allows the user to sign in' do scenario "with a non-matching case allows the user to sign in" do
fill_login_form("CASE_INSENSITIVE") fill_login_form("CASE_INSENSITIVE")
click_button submit(:user, :login) click_button submit(:user, :login)
expect(page).to have_content(I18n.t('login_successful')) expect(page).to have_content(I18n.t("login_successful"))
within user_status do within user_status do
expect(page).to have_content(account_link) expect(page).to have_content(account_link)
@ -39,6 +39,6 @@ feature 'Case insensitive login', js: :true do
end end
def account_link def account_link
'ACCOUNT' "ACCOUNT"
end end
end end

View file

@ -12,7 +12,7 @@ feature "Visitor signs up", js: :true do
fill_form(:user, user.slice(*sign_up_attributes)) fill_form(:user, user.slice(*sign_up_attributes))
click_button submit(:user, :create) click_button submit(:user, :create)
end end
expect(user_status).to have_content("ACCOUNT") expect(user_status).to have_content("ACCOUNT")
end end

6
spec/models/user_spec.rb Normal file → Executable file
View file

@ -22,7 +22,7 @@
# salt :string(255) # salt :string(255)
# #
require 'spec_helper' require "spec_helper"
describe User do describe User do
let!(:user) { create :user } let!(:user) { create :user }
@ -34,7 +34,7 @@ describe User do
it "returns true if user is banned" do it "returns true if user is banned" do
Ban.create!(ban_type: Ban::TYPE_SITE, Ban.create!(ban_type: Ban::TYPE_SITE,
expiry: Time.now + 10.days, expiry: Time.now.utc + 10.days,
user_name: user.username) user_name: user.username)
expect(user.banned?).to be_truthy expect(user.banned?).to be_truthy
@ -42,7 +42,7 @@ describe User do
it "returns true for specific bans" do it "returns true for specific bans" do
Ban.create!(ban_type: Ban::TYPE_MUTE, Ban.create!(ban_type: Ban::TYPE_MUTE,
expiry: Time.now + 10.days, expiry: Time.now.utc + 10.days,
user_name: user.username) user_name: user.username)
expect(user.banned? Ban::TYPE_MUTE).to be_truthy expect(user.banned? Ban::TYPE_MUTE).to be_truthy

2
spec/services/api/v1/users_collection_spec.rb Normal file → Executable file
View file

@ -28,4 +28,4 @@ describe Api::V1::UsersCollection do
end end
end end
end end
end end

2
spec/support/features/form_helpers.rb Normal file → Executable file
View file

@ -2,7 +2,7 @@ module Features
module FormHelpers module FormHelpers
def fill_form(model, hash) def fill_form(model, hash)
hash.each do |attribute, value| hash.each do |attribute, value|
fill_in attribute_translation(model, attribute), :with => value fill_in attribute_translation(model, attribute), with: value
end end
end end

54
spec/support/features/server_helpers.rb Normal file → Executable file
View file

@ -1,24 +1,24 @@
module Features module Features
module ServerHelpers module ServerHelpers
def test_server_creation_and_editing def test_server_creation_and_editing
dns = 'ServerDns.com' dns = "ServerDns.com"
ip = '192.168.1.1' ip = "192.168.1.1"
port = '8000' port = "8000"
password = 'secret' password = "secret"
name = 'MyNsServer' name = "MyNsServer"
description = 'My NS Server' description = "My NS Server"
irc = '#some_channel' irc = "#some_channel"
visit new_server_path visit new_server_path
fill_in 'Dns', with: dns fill_in "Dns", with: dns
fill_in 'server_ip', with: ip fill_in "server_ip", with: ip
fill_in 'server_port', with: port fill_in "server_port", with: port
fill_in 'Password', with: password fill_in "Password", with: password
fill_in 'Name', with: name fill_in "Name", with: name
fill_in 'Description', with: description fill_in "Description", with: description
fill_in 'Irc', with: irc fill_in "Irc", with: irc
check 'Available for officials?' check "Available for officials?"
click_button 'Save' click_button "Save"
expect(page).to have_content(dns) expect(page).to have_content(dns)
expect(page).to have_content("#{ip}:#{port}") expect(page).to have_content("#{ip}:#{port}")
@ -26,17 +26,17 @@ module Features
expect(page).to have_content(irc) expect(page).to have_content(irc)
expect(page).to have_content(description) expect(page).to have_content(description)
click_link 'Edit Server' click_link "Edit Server"
fill_in 'Dns', with: "#{dns}2" fill_in "Dns", with: "#{dns}2"
fill_in 'server_ip', with: "192.168.1.2" fill_in "server_ip", with: "192.168.1.2"
fill_in 'server_port', with: "8001" fill_in "server_port", with: "8001"
fill_in 'Password', with: "#{password}2" fill_in "Password", with: "#{password}2"
fill_in 'Name', with: "#{name}2" fill_in "Name", with: "#{name}2"
fill_in 'Description', with: "#{description}2" fill_in "Description", with: "#{description}2"
fill_in 'Irc', with: "#{irc}2" fill_in "Irc", with: "#{irc}2"
check 'Available for officials?' check "Available for officials?"
click_button 'Save' click_button "Save"
expect(page).to have_content("192.168.1.2:8001") expect(page).to have_content("192.168.1.2:8001")
expect(page).to have_content("#{dns}2") expect(page).to have_content("#{dns}2")
@ -45,4 +45,4 @@ module Features
expect(page).to have_content("#{description}2") expect(page).to have_content("#{description}2")
end end
end end
end end

12
spec/support/features/session_helpers.rb Normal file → Executable file
View file

@ -1,21 +1,21 @@
module Features module Features
module SessionHelpers module SessionHelpers
def sign_in_as(user) def sign_in_as(user)
visit root_path visit root_path
fill_in "login_username", with: user.username fill_in "login_username", with: user.username
fill_in "login_password", with: user.raw_password fill_in "login_password", with: user.raw_password
click_button I18n.t('helpers.submit.user.login') click_button I18n.t("helpers.submit.user.login")
end end
def change_timezone_for(user, timezone) def change_timezone_for(user, timezone)
visit edit_user_path(user.id) visit edit_user_path(user.id)
click_link I18n.t('profile.locals') click_link I18n.t("profile.locals")
find("option[value='#{timezone}']").select_option find("option[value='#{timezone}']").select_option
click_button I18n.t('helpers.submit.user.update') click_button I18n.t("helpers.submit.user.update")
end end
def user_status def user_status
@ -26,4 +26,4 @@ module Features
find "#new_user" find "#new_user"
end end
end end
end end