Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tests refletions

Tests refletions

First tech talk at Locaweb

Avatar for Rafael Lima

Rafael Lima

July 08, 2014

Other Decks in Technology

Transcript

  1. FFF ! - Full (Devem cobrir o seu sistema.) -

    Fast (Devem ser rápidos para minimizar o tempo que esperamos pelo feedback.) - Focus (Devem ser focados em fornecer detalhes específicos de onde o erro está.)
  2. Um controller que lista os produtos e suas categorias baseado

    no usuário (vendedor) que está logado
  3. class Dashboard::ProductsController < ApplicationController before_action :authenticate_user! def index @products =

    Product.where(seller_id: current_user.seller_id) @categories = Category.find(@products.map(&:category_id)) end end
  4. require 'spec_helper' describe Dashboard::ProductsController do let(:seller) { create :seller }

    let(:user) { create(:user, seller: seller) } let(:category) { create :category } let!(:product1) { create :product, name: 'p1', seller: seller, category: category } let!(:product2) { create :product, name: 'p2', seller: seller, category: category } let(:another_seller) { create :seller, id: 33 } let(:another_user) { create(:another_user, seller: another_seller) } let(:another_category) { create :category } let!(:anther_product) { create :product, seller: another_seller, category: another_category } before { sign_in user } describe 'GET index' do before { get :index } describe 'product list' do subject { assigns(:products) } it { should eq([product1, product2]) } end describe 'categories' do subject { assigns(:categories) } it { should eq([category]) } end end end
  5. class User < ActiveRecord::Base before_create :build_default_social_network attr_accessible :email, :password, :password_confirmation,

    :remember_me, :provider, :name, :user_name, :image, :image_cache, :remote_image_url, :profile_attributes, :accept_terms accepts_nested_attributes_for :profile mount_uploader :image, ProfileImageUploader validates :image, file_mime_type: { content_type: /image/ } validates :user_name, uniqueness: true, length: { maximum: 30 }, format: { with: /\A[a-zA-Z0-9_.]+\Z/, message: 'Only letters, numbers, underscore and dots' } validates :name, presence: true, on: :update validates :user_name, presence: true, on: :update validates :accept_terms, acceptance: true, on: :update has_one :profile, dependent: :destroy, class_name: 'UserProfile' has_one :social_network, dependent: :destroy has_many :product_entries, foreign_key: :participant_id has_many :products, foreign_key: :submitter_id has_many :yurns, foreign_key: :yurner_id has_many :bought_orders, foreign_key: :buyer_id, class_name: 'Order' has_many :sold_orders, foreign_key: :merchant_id, class_name: 'Order' has_many :follows, dependent: :destroy has_many :followers, through: :follows, class_name: 'User' def followed_by?(user) followers.include?(user) end def followed_by!(user) if user != self followers << user unless followed_by?(user) end end def not_followed_by?(user) ! followed_by?(user) end def not_followed_by!(user) Follow.destroy_all(follower_id: user, followable_id: self, followable_type: self.send(:class)) end end
  6. class Group < ActiveRecord::Base scope :active, -> { where(active: true)

    } attr_accessible :description, :name, :author, :image, :author_id, :board_ids, :admin_ids mount_uploader :image, GroupImageUploader validates :image, file_mime_type: { content_type: /image/ } validates_presence_of :name belongs_to :author, class_name: 'User', foreign_key: "author_id" has_and_belongs_to_many :boards, join_table: "groups_boards" has_many :group_collaborations, dependent: :destroy has_many :collaborators, through: :group_collaborations has_many :modules, foreign_key: "group_id", class_name: "GroupModule" has_many :twitter_modules has_many :discussion_modules has_many :poll_modules has_many :user_modules has_many :board_modules has_many :follows, dependent: :destroy has_many :followers, through: :follows, class_name: 'User' def followed_by?(user) followers.include?(user) end def followed_by!(user) if user != self followers << user unless followed_by?(user) end end def not_followed_by?(user) ! followed_by?(user) end def not_followed_by!(user) Follow.destroy_all(follower_id: user, followable_id: self, followable_type: self.send(:class)) end end
  7. require 'active_support/concern' ! module Concerns module Followable extend ActiveSupport::Concern !

    included do has_many :follows, as: :followable, dependent: :destroy has_many :followers, through: :follows, class_name: 'User' end ! def followed_by?(user) followers.include?(user) end ! def followed_by!(user) if user != self followers << user unless followed_by?(user) end end ! def not_followed_by?(user) ! followed_by?(user) end ! def not_followed_by!(user) Follow.destroy_all(follower_id: user, followable_id: self, followable_type: self.send(:class)) end end end
  8. class User < ActiveRecord::Base before_create :build_default_social_network attr_accessible :email, :password, :password_confirmation,

    :remember_me, :provider, :name, :user_name, :image, :image_cache, :remote_image_url, :profile_attributes, :accept_terms accepts_nested_attributes_for :profile mount_uploader :image, ProfileImageUploader validates :image, file_mime_type: { content_type: /image/ } validates :user_name, uniqueness: true, length: { maximum: 30 }, format: { with: /\A[a-zA-Z0-9_.]+\Z/, message: 'Only letters, numbers, underscore and dots' } validates :name, presence: true, on: :update validates :user_name, presence: true, on: :update validates :accept_terms, acceptance: true, on: :update has_one :profile, dependent: :destroy, class_name: 'UserProfile' has_one :social_network, dependent: :destroy has_many :product_entries, foreign_key: :participant_id has_many :products, foreign_key: :submitter_id has_many :yurns, foreign_key: :yurner_id has_many :bought_orders, foreign_key: :buyer_id, class_name: 'Order' has_many :sold_orders, foreign_key: :merchant_id, class_name: 'Order' include Concerns::Followable end
  9. class Group < ActiveRecord::Base scope :active, -> { where(active: true)

    } attr_accessible :description, :name, :author, :image, :author_id, :board_ids, :admin_ids belongs_to :author, class_name: 'User', foreign_key: "author_id" has_and_belongs_to_many :boards, join_table: "groups_boards" has_many :group_collaborations, dependent: :destroy has_many :collaborators, through: :group_collaborations has_many :modules, foreign_key: "group_id", class_name: "GroupModule" has_many :twitter_modules has_many :discussion_modules has_many :poll_modules has_many :user_modules has_many :board_modules include Concerns::Followable end
  10. describe Event do describe "#running_today" do context "when events are

    happening today" do let(:yesterday_event) { FactoryGirl.create(:event, :today) } let(:today_event) { FactoryGirl.create(:event, :today) } let(:tomorrow_event) { FactoryGirl.create(:event, :today) } it "returns those events" do expect(Event.running_today).to eq [today_event] end end end end
  11. require 'spec_helper' describe EventsController do describe "GET /index" do get

    '/events', {}, { 'Accept' => Mime::JSON } expect(response).to be_success expect(response.content_type).to eq Mime::JSON end end