fron-ui 1.0.0rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +38 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/.yardopts +8 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +105 -0
- data/Rakefile +37 -0
- data/Readme.md +4 -0
- data/db.json +192 -0
- data/fron-ui.gemspec +21 -0
- data/lib/fron-ui.rb +1 -0
- data/lib/fron_ui.rb +5 -0
- data/lib/fron_ui/version.rb +7 -0
- data/opal/fron-ui/base.rb +49 -0
- data/opal/fron-ui/behaviors/action.rb +40 -0
- data/opal/fron-ui/behaviors/actions.rb +40 -0
- data/opal/fron-ui/behaviors/confirmation.rb +23 -0
- data/opal/fron-ui/behaviors/dropdown.rb +27 -0
- data/opal/fron-ui/behaviors/file.rb +48 -0
- data/opal/fron-ui/behaviors/intendable_children.rb +76 -0
- data/opal/fron-ui/behaviors/keydown.rb +31 -0
- data/opal/fron-ui/behaviors/loop.rb +41 -0
- data/opal/fron-ui/behaviors/render.rb +30 -0
- data/opal/fron-ui/behaviors/rest.rb +121 -0
- data/opal/fron-ui/behaviors/selectable_children.rb +67 -0
- data/opal/fron-ui/behaviors/serialize.rb +32 -0
- data/opal/fron-ui/behaviors/shortcuts.rb +35 -0
- data/opal/fron-ui/behaviors/state.rb +56 -0
- data/opal/fron-ui/behaviors/transition.rb +63 -0
- data/opal/fron-ui/components/action.rb +18 -0
- data/opal/fron-ui/components/box.rb +17 -0
- data/opal/fron-ui/components/button.rb +61 -0
- data/opal/fron-ui/components/calendar.rb +129 -0
- data/opal/fron-ui/components/checkbox.rb +57 -0
- data/opal/fron-ui/components/chooser.rb +246 -0
- data/opal/fron-ui/components/color_panel.rb +235 -0
- data/opal/fron-ui/components/color_picker.rb +111 -0
- data/opal/fron-ui/components/container.rb +61 -0
- data/opal/fron-ui/components/date_picker.rb +141 -0
- data/opal/fron-ui/components/drag.rb +76 -0
- data/opal/fron-ui/components/dropdown.rb +72 -0
- data/opal/fron-ui/components/icon.rb +29 -0
- data/opal/fron-ui/components/image.rb +77 -0
- data/opal/fron-ui/components/input.rb +30 -0
- data/opal/fron-ui/components/label.rb +9 -0
- data/opal/fron-ui/components/list.rb +34 -0
- data/opal/fron-ui/components/loader.rb +63 -0
- data/opal/fron-ui/components/modal.rb +0 -0
- data/opal/fron-ui/components/notifications.rb +73 -0
- data/opal/fron-ui/components/number.rb +202 -0
- data/opal/fron-ui/components/progress.rb +52 -0
- data/opal/fron-ui/components/slider.rb +47 -0
- data/opal/fron-ui/components/tabs.rb +149 -0
- data/opal/fron-ui/components/textarea.rb +13 -0
- data/opal/fron-ui/components/time.rb +65 -0
- data/opal/fron-ui/components/title.rb +34 -0
- data/opal/fron-ui/examples/blog/index.rb +289 -0
- data/opal/fron-ui/examples/comments/components/comment.rb +75 -0
- data/opal/fron-ui/examples/comments/components/comments.rb +93 -0
- data/opal/fron-ui/examples/comments/components/footer.rb +36 -0
- data/opal/fron-ui/examples/comments/components/header.rb +35 -0
- data/opal/fron-ui/examples/comments/components/list.rb +12 -0
- data/opal/fron-ui/examples/comments/index.rb +6 -0
- data/opal/fron-ui/examples/contacts/components/contacts.rb +100 -0
- data/opal/fron-ui/examples/contacts/components/details.rb +92 -0
- data/opal/fron-ui/examples/contacts/components/item.rb +46 -0
- data/opal/fron-ui/examples/contacts/components/list.rb +10 -0
- data/opal/fron-ui/examples/contacts/components/sidebar.rb +30 -0
- data/opal/fron-ui/examples/contacts/index.rb +6 -0
- data/opal/fron-ui/examples/editor/index.rb +164 -0
- data/opal/fron-ui/examples/kitchensink/index.rb +193 -0
- data/opal/fron-ui/examples/todos/components/item.rb +84 -0
- data/opal/fron-ui/examples/todos/components/options.rb +26 -0
- data/opal/fron-ui/examples/todos/components/todos.rb +145 -0
- data/opal/fron-ui/examples/todos/index.rb +6 -0
- data/opal/fron-ui/examples/webshop/index.rb +0 -0
- data/opal/fron-ui/fonts/ionicons.rb +2954 -0
- data/opal/fron-ui/fonts/open_sans.rb +19 -0
- data/opal/fron-ui/lib/collection.rb +138 -0
- data/opal/fron-ui/lib/date.rb +23 -0
- data/opal/fron-ui/lib/debounce.rb +14 -0
- data/opal/fron-ui/lib/image_loader.rb +13 -0
- data/opal/fron-ui/lib/lorem.rb +93 -0
- data/opal/fron-ui/lib/nil.rb +29 -0
- data/opal/fron-ui/lib/record.rb +23 -0
- data/opal/fron-ui/lib/state_serializer.rb +129 -0
- data/opal/fron-ui/lib/storage.rb +57 -0
- data/opal/fron-ui/spec/setup.rb +40 -0
- data/opal/fron-ui/ui.rb +40 -0
- data/opal/fron-ui/utils/theme_roller.rb +63 -0
- data/opal/fron-ui/vendor/autoprefixer.js +21114 -0
- data/opal/fron-ui/vendor/marked.js +1291 -0
- data/opal/fron-ui/vendor/md5.js +274 -0
- data/opal/fron-ui/vendor/moment.js +3083 -0
- data/opal/fron-ui/vendor/uuid.js +92 -0
- data/opal/fron_ui.rb +13 -0
- data/spec/behaviors/action_spec.rb +34 -0
- data/spec/behaviors/actions_spec.rb +38 -0
- data/spec/behaviors/confirmation_spec.rb +23 -0
- data/spec/behaviors/dropdown_spec.rb +32 -0
- data/spec/behaviors/render_spec.rb +20 -0
- data/spec/behaviors/rest_spec.rb +70 -0
- data/spec/behaviors/selectable_children_spec.rb +40 -0
- data/spec/behaviors/serialize_spec.rb +34 -0
- data/spec/components/action_spec.rb +7 -0
- data/spec/components/base_spec.rb +19 -0
- data/spec/components/box_spec.rb +7 -0
- data/spec/components/button_spec.rb +9 -0
- data/spec/components/calendar_spec.rb +58 -0
- data/spec/components/checkbox_spec.rb +20 -0
- data/spec/components/chooser_spec.rb +75 -0
- data/spec/components/color_panel_spec.rb +49 -0
- data/spec/components/color_picker_spec.rb +41 -0
- data/spec/components/container_spec.rb +23 -0
- data/spec/components/date_picker_spec.rb +71 -0
- data/spec/components/drag_spec.rb +20 -0
- data/spec/components/dropdown_spec.rb +33 -0
- data/spec/components/image_spec.rb +33 -0
- data/spec/components/input_spec.rb +8 -0
- data/spec/components/list_spec.rb +10 -0
- data/spec/components/loader_spec.rb +9 -0
- data/spec/components/notifications_spec.rb +17 -0
- data/spec/components/number_spec.rb +64 -0
- data/spec/components/progress_spec.rb +23 -0
- data/spec/components/slider_spec.rb +25 -0
- data/spec/components/tabs_spec.rb +50 -0
- data/spec/components/textarea_spec.rb +7 -0
- data/spec/components/time_spec.rb +37 -0
- data/spec/components/title_spec.rb +11 -0
- data/spec/examples/comments_spec.rb +72 -0
- data/spec/examples/todos_spec.rb +39 -0
- data/spec/lib/collection_spec.rb +38 -0
- data/spec/lib/lorem_spec.rb +55 -0
- data/spec/lib/state_serializer_spec.rb +58 -0
- data/spec/lib/storage_spec.rb +39 -0
- data/spec/spec_helper.rb +1 -0
- metadata +223 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UI::Notifications do
|
|
4
|
+
it 'should display notifications' do
|
|
5
|
+
expect {
|
|
6
|
+
subject.push 'Test'
|
|
7
|
+
}.to change { subject.children.count }.from(0).to(1)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'should remove notificaion' do
|
|
11
|
+
noti = subject.push 'Test'
|
|
12
|
+
expect {
|
|
13
|
+
noti.trigger :animationend, animationName: 'ui-notification-show'
|
|
14
|
+
noti.trigger :animationend, animationName: 'ui-notification-hide'
|
|
15
|
+
}.to change { noti.parent }.from(subject).to(nil)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UI::NumberRange do
|
|
4
|
+
let(:input) { subject.find('ui-number-range-input') }
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
allow(subject).to receive(:width).and_return 200
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'should have a default value' do
|
|
11
|
+
subject.value.should eq 0
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#on_mouse_move' do
|
|
15
|
+
it 'should set the cursor' do
|
|
16
|
+
expect {
|
|
17
|
+
subject.trigger :mousemove, pageX: 10
|
|
18
|
+
}.to change { subject.style.cursor }.from('').to('move')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '#input' do
|
|
23
|
+
it 'should set placeholder character' do
|
|
24
|
+
expect {
|
|
25
|
+
subject.text = ''
|
|
26
|
+
subject.input
|
|
27
|
+
}.to change { input.html }.from('0.0').to(`'\ufeff'`)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe '#keydown' do
|
|
32
|
+
let(:event) { double key: :enter }
|
|
33
|
+
it 'should prevent the event' do
|
|
34
|
+
event.should receive(:prevent_default)
|
|
35
|
+
subject.keydown event
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context 'Changing the maximum value' do
|
|
40
|
+
it 'should reset the value' do
|
|
41
|
+
subject.value = 100
|
|
42
|
+
expect {
|
|
43
|
+
subject.max = 10
|
|
44
|
+
}.to change { subject.value }.from(100).to(10)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'Bluring the input' do
|
|
49
|
+
it 'should set the value' do
|
|
50
|
+
input.text = 10
|
|
51
|
+
expect {
|
|
52
|
+
input.trigger :blur
|
|
53
|
+
}.to change { subject.value }.from(0).to(10)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'Dragging horizontally' do
|
|
58
|
+
it 'should increase the value' do
|
|
59
|
+
expect {
|
|
60
|
+
mock_drag subject.drag, 10, 10
|
|
61
|
+
}.to change { subject.value }.from(0).to(10)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UI::Progress do
|
|
4
|
+
it 'should have a default value' do
|
|
5
|
+
subject.value.should eq 0
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe '#value=' do
|
|
9
|
+
it 'should set the value' do
|
|
10
|
+
expect {
|
|
11
|
+
subject.value = 0.1
|
|
12
|
+
}.to change { subject.bar.style.width.to_i }.from(0).to(10)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '#color=' do
|
|
17
|
+
it 'should set the color' do
|
|
18
|
+
expect {
|
|
19
|
+
subject.color = :red
|
|
20
|
+
}.to change { subject.bar.style.backgroundColor }.to('red')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UI::Slider do
|
|
4
|
+
before do
|
|
5
|
+
allow(subject).to receive(:width).and_return 100
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should have tabindex' do
|
|
9
|
+
subject.tabindex.should eq '0'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe '#value' do
|
|
13
|
+
it 'should return value' do
|
|
14
|
+
subject.value.should eq 0
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe '#value=' do
|
|
19
|
+
it 'should set the value' do
|
|
20
|
+
expect {
|
|
21
|
+
subject.value = 0.5
|
|
22
|
+
}.to change { subject.handle.style.left }.from('').to('50px')
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
class Tab < UI::Tabs::Tab
|
|
4
|
+
tag 'div'
|
|
5
|
+
defaults tab_id: 'test',
|
|
6
|
+
tab_title: 'test'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Tab2 < UI::Tabs::Tab
|
|
10
|
+
tag 'div'
|
|
11
|
+
defaults tab_id: 'test2',
|
|
12
|
+
tab_title: 'test2'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe UI::Tabs do
|
|
16
|
+
let(:tab) { Tab.new }
|
|
17
|
+
let(:selected) { subject.find('[tab_id].selected') }
|
|
18
|
+
|
|
19
|
+
before do
|
|
20
|
+
subject << tab
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should create tabs' do
|
|
24
|
+
subject.insert_before tab, nil
|
|
25
|
+
subject.handles.children.count.should eq 1
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should select first tab' do
|
|
29
|
+
selected.should_not be_nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'Selecting an other tab' do
|
|
33
|
+
it 'should deselect active one' do
|
|
34
|
+
tab2 = Tab2.new
|
|
35
|
+
subject << tab2
|
|
36
|
+
expect {
|
|
37
|
+
subject.select tab2
|
|
38
|
+
}.to change { selected.has_class(:selected) }.from(true).to(false)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'Removing an tab' do
|
|
43
|
+
it 'should remove the handler' do
|
|
44
|
+
subject
|
|
45
|
+
expect {
|
|
46
|
+
tab.remove!
|
|
47
|
+
}.to change { subject.handles.children.count }.from(1).to(0)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module UI
|
|
4
|
+
# Stub timeout so we don't go into recursion
|
|
5
|
+
class Time < Fron::Component
|
|
6
|
+
def timeout
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe UI::Time do
|
|
12
|
+
describe '#recall' do
|
|
13
|
+
it 'should call render' do
|
|
14
|
+
subject.should receive(:render)
|
|
15
|
+
subject.should receive(:timeout).and_yield
|
|
16
|
+
subject.recall
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe '#value=' do
|
|
21
|
+
it 'should set value' do
|
|
22
|
+
subject.value = Date.parse('2015-01-01')
|
|
23
|
+
subject.text.should eq '2015-01-01'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'From now' do
|
|
28
|
+
before do
|
|
29
|
+
subject.from_now = true
|
|
30
|
+
subject.render
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should render time' do
|
|
34
|
+
subject.text.should eq 'a few seconds ago'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'fron-ui/examples/comments/components/comments'
|
|
3
|
+
|
|
4
|
+
describe Examples::Comments do
|
|
5
|
+
let(:user) { { name: 'Test Joe', image: '//placehold.it/250/f9f9f9/333' } }
|
|
6
|
+
let(:items) {
|
|
7
|
+
[
|
|
8
|
+
{ id: '0', date: Time.now, user: user, body: '<p>test</p>', votes: 0 }
|
|
9
|
+
]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
before do
|
|
13
|
+
allow(subject).to receive(:request).with(:get, '').and_yield items
|
|
14
|
+
subject.load
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
let(:comment) { subject.find('ui-comment') }
|
|
18
|
+
|
|
19
|
+
it 'should display comments' do
|
|
20
|
+
comment.should_not be_nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context 'Filling the textarea and clicking on the button' do
|
|
24
|
+
it 'should add a comment' do
|
|
25
|
+
subject.should receive(:request).with(:post,
|
|
26
|
+
'',
|
|
27
|
+
hash_including(body: '<p>testasd</p>')).and_yield
|
|
28
|
+
subject.input.value = 'testasd'
|
|
29
|
+
expect {
|
|
30
|
+
subject.find('[action=add]').trigger :click
|
|
31
|
+
}.to change { subject.input.value }.from('testasd').to(nil)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'Clicking on reply' do
|
|
36
|
+
it 'should focus the textarea' do
|
|
37
|
+
subject.input.should receive(:focus)
|
|
38
|
+
subject.find('[action=reply]').trigger :click
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'Voting up' do
|
|
43
|
+
let(:item) { comment.find('[action=vote_up]') }
|
|
44
|
+
it 'should increase the count' do
|
|
45
|
+
comment.should receive(:request).with(:patch,
|
|
46
|
+
'0',
|
|
47
|
+
hash_including(votes: 1)).and_yield(items[0].merge(votes: 1))
|
|
48
|
+
expect {
|
|
49
|
+
item.trigger :click
|
|
50
|
+
}.to change { item.label.text }.from('0').to('1')
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'Voting down' do
|
|
55
|
+
let(:item) { comment.find('[action=vote_down]') }
|
|
56
|
+
it 'should decrease the count' do
|
|
57
|
+
comment.should receive(:request).with(:patch,
|
|
58
|
+
'0',
|
|
59
|
+
hash_including(votes: -1)).and_yield(items[0].merge(votes: -1))
|
|
60
|
+
expect {
|
|
61
|
+
item.trigger :click
|
|
62
|
+
}.to change { comment.find('[action=vote_up]').label.text }.from('0').to('-1')
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context 'Clicking on remove icon' do
|
|
67
|
+
it 'should remove the comment' do
|
|
68
|
+
comment.should receive(:request).with(:delete, '0').and_yield
|
|
69
|
+
comment.find('[action="confirm_destroy!"]').trigger :click
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'fron-ui/examples/todos/components/todos'
|
|
3
|
+
|
|
4
|
+
describe Examples::Todos do
|
|
5
|
+
let(:items) { [{ done: false, id: 1, test: 'Todo Item #1' }] }
|
|
6
|
+
let(:item) { subject.find('ui-todo-item') }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
allow(subject).to receive(:request).with(:get, '').and_yield items
|
|
10
|
+
subject.refresh
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should display items' do
|
|
14
|
+
item.should_not be_nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'Clicking on item' do
|
|
18
|
+
it 'should destroy it' do
|
|
19
|
+
expect(item).to receive(:request).with(:delete, 1).and_yield
|
|
20
|
+
item.find('[action="confirm_destroy!"]').trigger :click
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'Checking an item' do
|
|
25
|
+
it 'should update it' do
|
|
26
|
+
expect(item).to receive(:request).with(:patch, 1, done: true).and_yield
|
|
27
|
+
item.checkbox.trigger :click
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'Adding an item' do
|
|
32
|
+
it 'should create it' do
|
|
33
|
+
data = hash_including text: 'Test', done: false
|
|
34
|
+
expect(subject).to receive(:request).with(:post, '', data).and_yield
|
|
35
|
+
subject.header.input.value = 'Test'
|
|
36
|
+
subject.header.button.trigger :click
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Collection do
|
|
4
|
+
let(:data) { [{ id: 0 }, { id: 1 }] }
|
|
5
|
+
let(:new_data) { [{ id: 2 }, { id: 0 }, { id: 3 }] }
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
subject.items = data
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context 'Initial state' do
|
|
12
|
+
it 'should create items first time' do
|
|
13
|
+
subject.children.count.should eq 2
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'should keep order' do
|
|
17
|
+
subject.items.map { |item| item.data[:id] }.should eq [0, 1]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'Updated state' do
|
|
22
|
+
let(:item1) { subject.items.find { |item| item.data[:id] == 1 } }
|
|
23
|
+
let(:item0) { subject.items.find { |item| item.data[:id] == 0 } }
|
|
24
|
+
let(:expectation) { expect { subject.items = new_data } }
|
|
25
|
+
|
|
26
|
+
it 'should remove items' do
|
|
27
|
+
expectation.to change { item1.parent }.to nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'should reposition items' do
|
|
31
|
+
expectation.to change { item0.index }.from(0).to(1)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should add new items' do
|
|
35
|
+
expectation.to change { subject.children.count }.from(2).to(3)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Lorem do
|
|
4
|
+
subject { described_class }
|
|
5
|
+
|
|
6
|
+
describe '#name' do
|
|
7
|
+
it 'should return a name' do
|
|
8
|
+
first, last = subject.name.split(' ')
|
|
9
|
+
subject::FIRST_NAMES.should include(first)
|
|
10
|
+
subject::LAST_NAMES.should include(last)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe '#paragraph' do
|
|
15
|
+
it 'should return a paragraph' do
|
|
16
|
+
paragraph = subject.paragraph
|
|
17
|
+
paragraph.should start_with('<p>')
|
|
18
|
+
paragraph.should end_with('</p>')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe '#sentence' do
|
|
23
|
+
it 'return a sentence' do
|
|
24
|
+
sentence = subject.sentence((1..1), '?')
|
|
25
|
+
sentence.should end_with('?')
|
|
26
|
+
sentence[0].should match(/[A-Z]/)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe '#sentences' do
|
|
31
|
+
it 'should call sentence count times' do
|
|
32
|
+
subject.should receive(:sentence).twice
|
|
33
|
+
subject.sentences(2)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe '#paragraphs' do
|
|
38
|
+
it 'should call paragraph count times' do
|
|
39
|
+
subject.should receive(:paragraph).twice
|
|
40
|
+
subject.paragraphs(2)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe '#avatar' do
|
|
45
|
+
it 'should return an avatar' do
|
|
46
|
+
subject.avatar('men', 0).should eq 'https://randomuser.me/api/portraits/men/0.jpg'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe '#image' do
|
|
51
|
+
it 'should return an image' do
|
|
52
|
+
subject.image(100, 100).should eq 'http://lorempixum.com/100/100'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|