fron 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +35 -0
  6. data/Rakefile +18 -0
  7. data/docs/configuration.md +8 -8
  8. data/lib/fron/version.rb +1 -1
  9. data/opal/fron/core.rb +1 -1
  10. data/opal/fron/core/adapters/{local-storage.rb → local.rb} +7 -6
  11. data/opal/fron/core/application.rb +13 -11
  12. data/opal/fron/core/configuration.rb +3 -4
  13. data/opal/fron/core/controller.rb +2 -2
  14. data/opal/fron/core/eventable.rb +5 -2
  15. data/opal/fron/core/logger.rb +7 -0
  16. data/opal/fron/core/model.rb +10 -8
  17. data/opal/fron/core/router.rb +1 -1
  18. data/opal/fron/dom.rb +1 -0
  19. data/opal/fron/dom/document.rb +4 -0
  20. data/opal/fron/dom/element.rb +22 -6
  21. data/opal/fron/dom/event.rb +71 -68
  22. data/opal/fron/dom/fragment.rb +1 -3
  23. data/opal/fron/dom/modules/classlist.rb +2 -2
  24. data/opal/fron/dom/modules/dimensions.rb +7 -8
  25. data/opal/fron/dom/modules/events.rb +57 -12
  26. data/opal/fron/dom/node.rb +45 -11
  27. data/opal/fron/dom/nodelist.rb +14 -0
  28. data/opal/fron/dom/style.rb +17 -15
  29. data/opal/fron/dom/text.rb +2 -4
  30. data/opal/fron/dom/window.rb +2 -3
  31. data/opal/fron/request/request.rb +17 -14
  32. data/opal/fron/storage/local-storage.rb +29 -13
  33. data/spec/core-ext/hash_spec.rb +18 -0
  34. data/spec/core/adapter/local_spec.rb +65 -0
  35. data/spec/core/adapter/rails_spec.rb +72 -0
  36. data/spec/core/application_spec.rb +35 -0
  37. data/spec/core/component_spec.rb +107 -0
  38. data/spec/core/configuration_spec.rb +20 -0
  39. data/spec/core/controlller_spec.rb +68 -0
  40. data/spec/core/eventable_spec.rb +74 -0
  41. data/spec/core/logger_spec.rb +28 -0
  42. data/spec/core/model_spec.rb +125 -0
  43. data/spec/core/router_spec.rb +127 -0
  44. data/spec/dom/document_spec.rb +41 -0
  45. data/spec/dom/element_spec.rb +164 -0
  46. data/spec/dom/event_spec.rb +121 -0
  47. data/spec/dom/fragment_spec.rb +13 -0
  48. data/spec/dom/modules/classlist_spec.rb +72 -0
  49. data/spec/dom/modules/dimensions_spec.rb +55 -0
  50. data/spec/dom/modules/events_spec.rb +73 -0
  51. data/spec/dom/node_spec.rb +189 -0
  52. data/spec/dom/nodelist_spec.rb +12 -0
  53. data/spec/dom/style_spec.rb +31 -0
  54. data/spec/dom/text_spec.rb +12 -0
  55. data/spec/dom/window_spec.rb +30 -0
  56. data/spec/request/request_spec.rb +71 -0
  57. data/spec/request/response_spec.rb +46 -0
  58. data/spec/storage/local-storage_spec.rb +58 -0
  59. metadata +36 -4
@@ -0,0 +1,72 @@
1
+ require 'fron/core'
2
+ require 'fron/storage'
3
+
4
+ describe Fron::Adapters::RailsAdapter do
5
+
6
+ subject do
7
+ described_class.new({
8
+ fields: [:name],
9
+ endpoint: "test",
10
+ resources: "users",
11
+ resource: "user"
12
+ })
13
+ end
14
+
15
+ let(:proc) { Proc.new {} }
16
+ let(:request) { double :request }
17
+
18
+ before do
19
+ subject.instance_variable_set "@request", request
20
+ end
21
+
22
+ describe "#all" do
23
+ it "should call GET request to resources url" do
24
+ request.should receive(:url=).with "test/users.json"
25
+ request.should receive(:get) do |&block|
26
+ block.call double json: true
27
+ end
28
+ proc.should receive(:call)
29
+ subject.all &proc
30
+ end
31
+ end
32
+
33
+ describe "#get" do
34
+ it "should call GET request to resource url" do
35
+ request.should receive(:url=).with "test/users/0"
36
+ request.should receive(:get) do |&block|
37
+ block.call double json: true
38
+ end
39
+ proc.should receive(:call)
40
+ subject.get '0', &proc
41
+ end
42
+ end
43
+
44
+ describe "#set" do
45
+ it "should call POST request for new record" do
46
+ request.should receive(:url=).with "test/users.json"
47
+ request.should receive(:post) do |&block|
48
+ block.call double status: 201
49
+ end
50
+ proc.should receive(:call)
51
+ subject.set nil, {}, &proc
52
+ end
53
+
54
+ it "should call PUT request for exsistsing record" do
55
+ request.should receive(:url=).with "test/users/0"
56
+ request.should receive(:put) do |&block|
57
+ block.call double status: 201
58
+ end
59
+ proc.should receive(:call)
60
+ subject.set 0, {}, &proc
61
+ end
62
+
63
+ it "should call block with error" do
64
+ request.should receive(:url=).with "test/users/0"
65
+ request.should receive(:put) do |&block|
66
+ block.call double status: 422, json: 'error'
67
+ end
68
+ proc.should receive(:call).with 'error'
69
+ subject.set 0, {}, &proc
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,35 @@
1
+ require 'fron/core'
2
+
3
+ class TestApplication < Fron::Application
4
+ config.title = 'Test Application'
5
+ config.logger.level = :error
6
+ end
7
+
8
+ describe Fron::Application do
9
+
10
+ subject { TestApplication.new }
11
+
12
+ after do
13
+ subject.config.app.remove!
14
+ end
15
+
16
+ describe "#initialize" do
17
+ it 'should insert the application into the DOM' do
18
+ subject.config.app.parent.should_not be nil
19
+ end
20
+
21
+ it 'should set the title of the document' do
22
+ DOM::Document.title.should eq 'Test Application'
23
+ end
24
+ end
25
+
26
+ describe "#loadExternalStylesheets" do
27
+ it 'should load external stylesheets' do
28
+ subject.config.stylesheets = ['test']
29
+ subject.send(:loadExternalStylesheets)
30
+ link = DOM::Document.head.find('link')
31
+ link['href'].should be 'test'
32
+ link.remove!
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,107 @@
1
+ require 'fron/core'
2
+
3
+ class TestComponent < Fron::Component
4
+ attr_reader :rendered
5
+
6
+ def render
7
+ @rendered = true
8
+ end
9
+ end
10
+
11
+ describe Fron::Component do
12
+
13
+ subject { TestComponent.new }
14
+ let(:listeners) { subject.instance_variable_get("@listeners") }
15
+
16
+ describe "DSL" do
17
+
18
+ subject { TestComponent }
19
+
20
+ describe "#tag" do
21
+ it 'should set the tagname' do
22
+ subject.tag 'td'
23
+ subject.tagname.should eq 'td'
24
+ end
25
+ end
26
+
27
+ describe "#on" do
28
+ it 'should create events array' do
29
+ subject.on :click, :test
30
+ subject.events.should_not be nil
31
+ end
32
+
33
+ it 'should push event into the events array' do
34
+ subject.on :click, :test
35
+ subject.events.length.should be 2
36
+ end
37
+ end
38
+
39
+ describe '#component' do
40
+ it 'should create components array' do
41
+ subject.component :test, 'test'
42
+ subject.components.should_not be nil
43
+ subject.components.length.should be 1
44
+ end
45
+
46
+ it 'should create attr_reader for component' do
47
+ subject.component :a, 'a'
48
+ subject.instance_methods.include?(:a).should be true
49
+ end
50
+ end
51
+
52
+ describe '#delegate' do
53
+ it 'should create delegated methods' do
54
+ subject.delegate :text, :test
55
+ subject.instance_methods.include?(:text).should be true
56
+ subject.instance_methods.include?(:text=).should be true
57
+ end
58
+ end
59
+ end
60
+
61
+ describe "#initialize" do
62
+ it 'should create element' do
63
+ subject.tag.should eq 'td'
64
+ end
65
+
66
+ it 'should apply events' do
67
+ listeners[:click].length.should eq 2
68
+ end
69
+
70
+ it 'should create components' do
71
+ subject.a.should_not be nil
72
+ subject.a.tag.should eq 'a'
73
+
74
+ subject.test.should_not be nil
75
+ subject.test.tag.should be 'test'
76
+ end
77
+
78
+ it 'should call render if model given' do
79
+ comp = TestComponent.new(Fron::Model.new)
80
+ comp.rendered.should be true
81
+ end
82
+ end
83
+
84
+ describe "#component" do
85
+ it 'should create a component from a Class' do
86
+ subject.component 'b', TestComponent
87
+ subject.instance_variable_get("@b").class.should eq TestComponent
88
+ end
89
+
90
+ it 'should create a component from a String' do
91
+ subject.component 'e', 'i'
92
+ subject.instance_variable_get("@e").class.should eq Fron::Component
93
+ end
94
+
95
+ it 'should append component' do
96
+ subject.component 'd', TestComponent
97
+ comp = subject.instance_variable_get("@d")
98
+ comp.parent.should eq subject
99
+ end
100
+
101
+ it 'should call block if block given' do
102
+ called = false
103
+ subject.component('c', 'x') { called = true }
104
+ called.should be true
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,20 @@
1
+ require 'fron'
2
+
3
+ describe Fron::Configuration do
4
+
5
+ subject { described_class.new }
6
+
7
+ describe '#initialize' do
8
+ it 'should create a logger' do
9
+ subject.logger.class.should be Fron::Logger
10
+ end
11
+
12
+ it 'should create the application container' do
13
+ subject.app.class.should be Fron::Configuration::App
14
+ end
15
+
16
+ it 'should create the yield container' do
17
+ subject.main.class.should be Fron::Configuration::Yield
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ require 'fron/core'
2
+
3
+ class TestController < Fron::Controller
4
+ end
5
+
6
+ describe TestController do
7
+
8
+ subject { described_class.new }
9
+
10
+ describe 'DSL' do
11
+
12
+ subject { TestController }
13
+
14
+ describe '#base' do
15
+ it 'should set the baseComponent' do
16
+ subject.base Fron::Component
17
+ subject.baseComponent.should eq Fron::Component
18
+ end
19
+ end
20
+
21
+ describe '#route' do
22
+ it 'should set routes map' do
23
+ allow(Fron::Router).to receive(:map)
24
+ subject.route '/', :test
25
+ subject.routes.should_not be nil
26
+ subject.routes.length.should eq 1
27
+ end
28
+
29
+ it 'should call Router.map' do
30
+ expect(Fron::Router).to receive(:map).once
31
+ subject.route '/a', :a
32
+ end
33
+ end
34
+
35
+ describe '#on' do
36
+ it 'should set events array' do
37
+ subject.on :event, :action
38
+ subject.events.should_not be nil
39
+ subject.events[0].should eq({name: :event, action: :action})
40
+ end
41
+ end
42
+
43
+ describe '#before' do
44
+ it 'should set before filters' do
45
+ subject.before :method, :action
46
+ subject.beforeFilters.should_not be nil
47
+ subject.beforeFilters[0].should eq({method: :method, actions: :action})
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#initialize" do
53
+ it 'should create Element if no component is specified' do
54
+ TestController.base nil
55
+ subject.base.class.should eq DOM::Element
56
+ end
57
+
58
+ it 'should create component if component is specified' do
59
+ TestController.base Fron::Component
60
+ subject.base.class.should eq Fron::Component
61
+ end
62
+
63
+ it 'should call Eventable.on for event' do
64
+ expect(Fron::Eventable).to receive(:on).once.with 'event'
65
+ subject
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,74 @@
1
+ require 'fron/core'
2
+
3
+ class TestEventable
4
+ include Fron::Eventable
5
+ end
6
+
7
+ describe Fron::Eventable do
8
+
9
+ subject { described_class }
10
+ let(:events) { subject.instance_variable_get("@events") }
11
+ let(:instance) { TestEventable.new }
12
+
13
+ describe "#on" do
14
+ it "should add to events array" do
15
+ subject.on 'event' do end
16
+ events.should_not be nil
17
+ events[:event].should_not be nil
18
+ end
19
+
20
+ it "should add block to events array" do
21
+ a = Proc.new {}
22
+ subject.on 'event', &a
23
+ events[:event].last.should eq a
24
+ end
25
+ end
26
+
27
+ describe "#trigger" do
28
+ it "should not trigger global event if called on self" do
29
+ expect(subject).to receive(:trigger).once.and_call_original
30
+ subject.trigger 'test'
31
+ end
32
+
33
+ it "should trigger global event if specified and not self" do
34
+ expect(subject).to receive(:trigger).once.and_call_original
35
+ instance.on 'test' do end
36
+ instance.trigger 'test'
37
+ end
38
+
39
+ it "should not trigger global event if not specified" do
40
+ expect(subject).not_to receive(:trigger)
41
+ instance.trigger 'test', false
42
+ end
43
+
44
+ it "should call listeners" do
45
+ a = Proc.new {}
46
+ expect(a).to receive(:call)
47
+ instance.on 'test', &a
48
+ instance.trigger 'test'
49
+ end
50
+ end
51
+
52
+ describe "#off" do
53
+ it "should remove the block from the events array" do
54
+ block = subject.on 'test' do end
55
+ events['test'].last.should eq block
56
+ subject.off 'test', block
57
+ events['test'].last.should_not eq block
58
+ end
59
+
60
+ it 'should remove all corressponding events' do
61
+ subject.on 'test' do end
62
+ events['test'].length.should_not be 0
63
+ subject.off 'test'
64
+ events['test'].length.should be 0
65
+ end
66
+
67
+ it 'should remove all events' do
68
+ subject.on 'test' do end
69
+ events.keys.length.should eq 2
70
+ subject.off
71
+ events.keys.length.should eq 0
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,28 @@
1
+ require 'fron/core'
2
+
3
+ describe Fron::Logger do
4
+
5
+ subject { described_class.new }
6
+
7
+ before do
8
+ allow(subject).to receive(:puts)
9
+ end
10
+
11
+ describe "#initialize" do
12
+ it 'should set log level to :info' do
13
+ subject.level.should eq :info
14
+ end
15
+ end
16
+
17
+ describe "#info" do
18
+ it "should add timestamp to message" do
19
+ expect(Time).to receive(:now).and_call_original
20
+ subject.info 'test'
21
+ end
22
+
23
+ it "should call puts" do
24
+ expect(subject).to receive(:puts).once
25
+ subject.info 'test'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,125 @@
1
+ require 'fron/core'
2
+
3
+ class TestModel < Fron::Model
4
+ end
5
+
6
+ class MockAdapter
7
+ def all(&block)
8
+ block.call [{},{}]
9
+ end
10
+
11
+ def get(&block)
12
+ block.call({name: 'User'})
13
+ end
14
+
15
+ def set(id,&block)
16
+ if id == 0
17
+ block.call
18
+ else
19
+ block.call({errors: true})
20
+ end
21
+ end
22
+ end
23
+
24
+ describe TestModel do
25
+
26
+ subject { described_class }
27
+
28
+ describe "DSL" do
29
+ describe "#adapter" do
30
+ it "should set adapter" do
31
+ subject.adapter MockAdapter
32
+ subject.adapterObject.should_not be nil
33
+ end
34
+ end
35
+
36
+ describe "#field" do
37
+ it "should set fields array" do
38
+ subject.field :name
39
+ subject.fields.should_not be nil
40
+ subject.fields.should include(:name)
41
+ end
42
+
43
+ it "should define methods" do
44
+ subject.field :description
45
+ subject.instance_methods.should include(:description)
46
+ subject.instance_methods.should include(:description=)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe "Class Methods" do
52
+ describe "#all" do
53
+ it "should call adapter#call" do
54
+ subject.adapterObject.should receive(:all)
55
+ subject.all
56
+ end
57
+
58
+ it "should call new on self class for items" do
59
+ subject.should receive(:new).twice
60
+ subject.adapterObject.should receive(:all).and_call_original
61
+ subject.all do end
62
+ end
63
+ end
64
+
65
+ describe "#find" do
66
+ it "should return class instance" do
67
+ subject.adapterObject.should receive(:get).and_call_original
68
+ subject.find do |instance|
69
+ instance.class.should eq described_class
70
+ end
71
+ end
72
+
73
+ it "should merge user data" do
74
+ subject.adapterObject.should receive(:get).and_call_original
75
+ subject.find do |instance|
76
+ instance.name.should eq 'User'
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "Instance Methods" do
83
+ subject { described_class.new({name: 'Test'}) }
84
+
85
+ describe "#initialize" do
86
+ it "should set data" do
87
+ subject.name.should eq 'Test'
88
+ end
89
+ end
90
+
91
+ describe "#update" do
92
+ it "should call adapter#set" do
93
+ described_class.adapterObject.should receive(:set).and_call_original
94
+ subject.update
95
+ end
96
+
97
+ it "should merge user data" do
98
+ described_class.adapterObject.should receive(:set).and_call_original
99
+ subject.id = 0
100
+ subject.update name: "User" do
101
+ subject.errors.should be nil
102
+ subject.name.should eq 'User'
103
+ end
104
+ end
105
+
106
+ it "should set errors" do
107
+ subject.id == 2
108
+ subject.update do
109
+ subject.errors.should_not be nil
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "#dirty?" do
115
+ it "should return true if there is no id" do
116
+ subject.dirty?.should eq true
117
+ end
118
+
119
+ it "should return false if there is and id" do
120
+ subject.id = 0
121
+ subject.dirty?.should eq false
122
+ end
123
+ end
124
+ end
125
+ end