Skip to content

Commit

Permalink
Changing module structure to conform with Mongoid 2.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
amartinsn committed Apr 16, 2012
1 parent 79f6559 commit 56a5909
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 29 deletions.
5 changes: 3 additions & 2 deletions lib/duration/mongoid.rb
@@ -1,11 +1,12 @@
require "#{File.dirname(__FILE__)}/../duration"
require "mongoid/fields"

# Mongoid serialization support for Duration type.
module Mongoid
module Fields
class Duration
include Serializable
include Mongoid::Fields::Serializable

# Deserialize a Duration given the amount of seconds stored by Mongodb
#
# @param [Integer, nil] duration in seconds
Expand Down
2 changes: 2 additions & 0 deletions ruby-duration.gemspec
Expand Up @@ -23,6 +23,8 @@ Gem::Specification.new do |s|
s.add_development_dependency "rake", ">= 0"
s.add_development_dependency "simplecov", ">= 0.3.5"
s.add_development_dependency "bluecloth", ">= 0.3.5"

s.add_runtime_dependency "mongoid", "~> 2.4.0"

s.files = `git ls-files`.split("\n")
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
Expand Down
75 changes: 48 additions & 27 deletions test/test_mongoid.rb
@@ -1,49 +1,70 @@
# -*- encoding: utf-8 -*-
require 'helper'
require 'duration/mongoid'
require 'mongoid'

describe "mongoid support" do
before do
@mongoid_field = Mongoid::Fields::Serializable::Duration.new
class MyModel

This comment has been minimized.

Copy link
@azisaka

azisaka Dec 6, 2012

Contributor

It's not a good idea to define a class inside the before block. This way the test suite will try to redefine the class for each "it" spec.

include Mongoid::Document
field :duration, type: Duration
end
@model = MyModel.new
end

describe "#get - Mongoid's deserialization" do
describe "assigning an integer value" do
it "should return the duration given the total in seconds" do
assert_equal Duration.new(90), @mongoid_field.deserialize(90)
@model.duration = 90
assert_equal @model.duration, Duration.new(90)
end

it "should return nil for nil serialized values" do
assert_nil @mongoid_field.deserialize(nil)
it "assigning a nil value" do
@model.duration = nil
assert_nil @model.duration
end
end

describe "#set - Mongoid's serialization" do
it "should serialize to nil given an invalid serialized value or nil" do
assert_nil @mongoid_field.serialize([1,2,3])
assert_nil @mongoid_field.serialize(nil)
assert_nil @mongoid_field.serialize("")
assert_nil @mongoid_field.serialize({})
assert_nil @mongoid_field.serialize({:seconds => "", :hours => ""})
assert_nil @mongoid_field.serialize({:x => 100, :seconds => ""})

describe "assigning an array" do
it "should return nil" do
@model.duration = [1,2,3]
assert_nil @model.duration
end

it "should return total seconds given a duration" do
assert_equal 90, @mongoid_field.serialize(Duration.new(:minutes => 1, :seconds => 30))
end

describe "assigning a valid hash" do
it "should return total seconds given a duration in hash" do
@model.duration = { :minutes => 1, :seconds => 30 }
assert_equal Duration.new({ :minutes => 1, :seconds => 30 }), @model.duration
end
end

it "should return total seconds given a duration in seconds" do
assert_equal 10, @mongoid_field.serialize(10)
end

it "should return total seconds given a duration in string" do
assert_equal 10, @mongoid_field.serialize("10")
assert_equal 10, @mongoid_field.serialize("10string")
assert_equal 0, @mongoid_field.serialize("string") # not blank
describe "assigning invalid hashes" do
it "should return nil" do
[{}, {:seconds => "", :hours => ""}, {:x => 100, :seconds => ""}].each do |value|
@model.duration = value
assert_nil @model.duration
end
end
end

it "should return total seconds given a duration in hash" do
assert_equal 90, @mongoid_field.serialize(:minutes => 1, :seconds => 30)
describe "assigning a Duration object" do
it "should return the duration value" do
duration = Duration.new(:minutes => 1, :seconds => 30)
@model.duration = duration
assert_equal duration, @model.duration
end
end

describe "assigning a string" do
it "should return total seconds given a duration in string" do
@model.duration = "10"
assert_equal Duration.new(10), @model.duration

@model.duration = "10string"
assert_equal Duration.new(10), @model.duration

@model.duration = "string"
assert_equal Duration.new(0), @model.duration
end
end
end

0 comments on commit 56a5909

Please sign in to comment.