1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
require 'cases/helper'
require 'tempfile'
module ActiveRecord
class FixtureSet
class FileTest < ActiveRecord::TestCase
def test_open
fh = File.open(::File.join(FIXTURES_ROOT, "accounts.yml"))
assert_equal 6, fh.to_a.length
end
def test_open_with_block
called = false
File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
called = true
assert_equal 6, fh.to_a.length
end
assert called, 'block called'
end
def test_names
File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
assert_equal ["signals37",
"unknown",
"rails_core_account",
"last_account",
"rails_core_account_2",
"odegy_account"].sort, fh.to_a.map(&:first).sort
end
end
def test_values
File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
assert_equal [1,2,3,4,5,6].sort, fh.to_a.map(&:last).map { |x|
x['id']
}.sort
end
end
def test_erb_processing
File.open(::File.join(FIXTURES_ROOT, "developers.yml")) do |fh|
devs = Array.new(8) { |i| "dev_#{i + 3}" }
assert_equal [], devs - fh.to_a.map(&:first)
end
end
def test_empty_file
tmp_yaml ['empty', 'yml'], '' do |t|
assert_equal [], File.open(t.path) { |fh| fh.to_a }
end
end
# A valid YAML file is not necessarily a value Fixture file. Make sure
# an exception is raised if the format is not valid Fixture format.
def test_wrong_fixture_format_string
tmp_yaml ['empty', 'yml'], 'qwerty' do |t|
assert_raises(ActiveRecord::Fixture::FormatError) do
File.open(t.path) { |fh| fh.to_a }
end
end
end
def test_wrong_fixture_format_nested
tmp_yaml ['empty', 'yml'], 'one: two' do |t|
assert_raises(ActiveRecord::Fixture::FormatError) do
File.open(t.path) { |fh| fh.to_a }
end
end
end
def test_render_context_helper
ActiveRecord::FixtureSet.context_class.class_eval do
def fixture_helper
"Fixture helper"
end
end
yaml = "one:\n name: <%= fixture_helper %>\n"
tmp_yaml ['curious', 'yml'], yaml do |t|
golden =
[["one", {"name" => "Fixture helper"}]]
assert_equal golden, File.open(t.path) { |fh| fh.to_a }
end
ActiveRecord::FixtureSet.context_class.class_eval do
remove_method :fixture_helper
end
end
def test_render_context_lookup_scope
yaml = <<END
one:
ActiveRecord: <%= defined? ActiveRecord %>
ActiveRecord_FixtureSet: <%= defined? ActiveRecord::FixtureSet %>
FixtureSet: <%= defined? FixtureSet %>
ActiveRecord_FixtureSet_File: <%= defined? ActiveRecord::FixtureSet::File %>
File: <%= File.name %>
END
golden = [['one', {
'ActiveRecord' => 'constant',
'ActiveRecord_FixtureSet' => 'constant',
'FixtureSet' => nil,
'ActiveRecord_FixtureSet_File' => 'constant',
'File' => 'File'
}]]
tmp_yaml ['curious', 'yml'], yaml do |t|
assert_equal golden, File.open(t.path) { |fh| fh.to_a }
end
end
# Make sure that each fixture gets its own rendering context so that
# fixtures are independent.
def test_independent_render_contexts
yaml1 = "<% def leaked_method; 'leak'; end %>\n"
yaml2 = "one:\n name: <%= leaked_method %>\n"
tmp_yaml ['leaky', 'yml'], yaml1 do |t1|
tmp_yaml ['curious', 'yml'], yaml2 do |t2|
File.open(t1.path) { |fh| fh.to_a }
assert_raises(NameError) do
File.open(t2.path) { |fh| fh.to_a }
end
end
end
end
private
def tmp_yaml(name, contents)
t = Tempfile.new name
t.binmode
t.write contents
t.close
yield t
ensure
t.close true
end
end
end
end
|