cirandas.net

ref: master

test/unit/acts_as_filesystem_test.rb


  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
require_relative "../test_helper"

class ActsAsFilesystemTest < ActiveSupport::TestCase

  # FIXME shouldn't we test with a non-real model, instead of Article?

  should 'provide a hierarchy list' do
    profile = create_user('testinguser').person

    a1 = profile.articles.create(:name => 'a1')
    a2 = profile.articles.create(:name => 'a2', :parent => a1)
    a3 = profile.articles.create(:name => 'a3', :parent => a2)

    assert_equal [a1, a2, a3], a3.hierarchy
  end

  should 'set ancestry' do
    c1 = create(Category, :name => 'c1')
    c2 = create(Category, :name => 'c2', :parent => c1)
    c3 = create(Category, :name => 'c3', :parent => c2)

    assert_not_nil c1.ancestry
    assert_not_nil c2.ancestry
    assert_equal "%010d.%010d" % [c1.id, c2.id], c3.ancestry
    assert_equal [c1, c2, c3], c3.hierarchy
  end

  should 'provide the level' do
    c1 = create(Category, :name => 'c1')
    c2 = create(Category, :name => 'c2', :parent => c1)
    c3 = create(Category, :name => 'c3', :parent => c2)

    assert_equal 0, c1.level
    assert_equal 1, c2.level
    assert_equal 2, c3.level
  end

  should 'be able to optionally reload the hierarchy' do
    a = Article.new
    list = a.hierarchy
    assert_same list, a.hierarchy
    assert_not_same list, a.hierarchy(true)
  end

  should 'list the full tree' do
    profile = create_user('testinguser').person

    a1 = profile.articles.build(:name => 'a1'); a1.save!

    a1_1 = a1.children.create!(:name => 'a1.1', :profile => profile)

    a1_2 = a1.children.create!(:name => 'a1.2', :profile => profile)

    a1_1_1 = a1_1.children.create!(:name => 'a1.1.1', :profile => profile)
    a1_1_2 = a1_1.children.create!(:name => 'a1.1.2', :profile => profile)

    a1.reload

    assert_equivalent [a1, a1_1, a1_2, a1_1_1, a1_1_2], a1.map_traversal
  end

  should 'list the full tree without the root' do
    profile = create_user('testinguser').person

    a1 = profile.articles.build(:name => 'a1'); a1.save!

    a1_1 = a1.children.create!(:name => 'a1.1', :profile => profile)

    a1_2 = a1.children.create!(:name => 'a1.2', :profile => profile)

    a1_1_1 = a1_1.children.create!(:name => 'a1.1.1', :profile => profile)
    a1_1_2 = a1_1.children.create!(:name => 'a1.1.2', :profile => profile)

    a1.reload

    assert_equivalent [a1_1, a1_2, a1_1_1, a1_1_2].map(&:id), a1.all_children.map(&:id)
  end

  should 'be able to traverse with a block' do
    profile = create_user('testinguser').person

    a1 = profile.articles.build(:name => 'a1'); a1.save!

    a1_1 = a1.children.create!(:name => 'a1.1', :profile => profile)

    a1_2 = a1.children.create!(:name => 'a1.2', :profile => profile)

    a1_1_1 = a1_1.children.create!(:name => 'a1.1.1', :profile => profile)
    a1_1_2 = a1_1.children.create!(:name => 'a1.1.2', :profile => profile)

    a1.reload

    assert_equivalent ['a1', 'a1.1', 'a1.2', 'a1.1.1', 'a1.1.2'], a1.map_traversal { |item| item.name }

  end

  should 'be able to list text articles that are children of a folder' do
    profile = create_user('testinguser').person
    folder = fast_create(Folder, :name => 'folder', :profile_id => profile.id)
    article1 = Article.create!(:name => 'article 1', :profile => profile, :parent => folder)
    article2 = Article.create!(:name => 'article 2', :profile => profile, :parent => folder)
    folder.reload

    items = folder.map_traversal

    assert_includes items, folder
    assert_includes items, article1
    assert_includes items, article2
  end

  should 'allow dots in slug' do
    assert_equal 'test.txt', Article.new(:name => 'test.txt').slug
  end

  should 'provide name without leading parents' do
    a = Article.new
    a.expects(:full_name).with('/').returns('a/b/c/d').times(3)
    assert_equal 'b/c/d', a.full_name_without_leading(1)
    assert_equal 'c/d', a.full_name_without_leading(2)
    assert_equal 'd', a.full_name_without_leading(3)
  end

  should 'cache children count' do
    profile = create_user('testinguser').person
    a1 = profile.articles.create!(:name => 'a1')
    a11 = profile.articles.create!(:name => 'a11', :parent => a1)
    a12 = profile.articles.create!(:name => 'a12', :parent => a1)
  end

end