diff --git a/assets/scripts/app/models/build.coffee b/assets/scripts/app/models/build.coffee index d2eedb31..707a7710 100644 --- a/assets/scripts/app/models/build.coffee +++ b/assets/scripts/app/models/build.coffee @@ -53,6 +53,17 @@ require 'travis/model' Travis.ajax.post '/requests', build_id: @get('id') ) + isAttributeLoaded: (key) -> + if ['_duration', 'finishedAt', 'result'].contains(key) && !@get('finished') + return true + else + @_super(key) + + finished: (-> + @get('state') == 'finished' + ).property('state') + + @Travis.Build.reopenClass byRepoId: (id, parameters) -> @find($.extend(parameters || {}, repository_id: id)) diff --git a/assets/scripts/app/models/job.coffee b/assets/scripts/app/models/job.coffee index 4bed6378..496f5897 100644 --- a/assets/scripts/app/models/job.coffee +++ b/assets/scripts/app/models/job.coffee @@ -52,9 +52,20 @@ require 'travis/model' Travis.app.pusher.subscribe "job-#{id}" onStateChange: (-> - Travis.app.pusher.unsubscribe "job-#{@get('id')}" if @get('state') == 'finished' + if @get('state') == 'finished' && Travis.app + Travis.app.pusher.unsubscribe "job-#{@get('id')}" ).observes('state') + isAttributeLoaded: (key) -> + if ['_duration', 'finishedAt', 'result'].contains(key) && !@get('finished') + return true + else + @_super(key) + + finished: (-> + @get('state') == 'finished' + ).property('state') + @Travis.Job.reopenClass queued: (queue) -> @find() diff --git a/assets/scripts/spec/unit/build_spec.coffee b/assets/scripts/spec/unit/build_spec.coffee new file mode 100644 index 00000000..2a81e1d1 --- /dev/null +++ b/assets/scripts/spec/unit/build_spec.coffee @@ -0,0 +1,30 @@ +store = null +record = null + +describe 'Travis.Build', -> + beforeEach -> + store = Travis.Store.create() + + afterEach -> + store.destroy() + + describe 'incomplete attributes', -> + beforeEach -> + record = store.loadIncomplete Travis.Build, { id: 1, state: 'started' } + + it 'does not load record on duration, finishedAt and result if job is not in finished state', -> + record.get('_duration') + record.get('finishedAt') + record.get('result') + + waits 50 + runs -> + expect( record.get('complete') ).toBeFalsy() + + it 'loads the rest of the record if it\'s in finished state', -> + record = store.loadIncomplete Travis.Build, { id: 1, state: 'finished' } + record.get('finishedAt') + + waits 50 + runs -> + expect( record.get('complete') ).toBeTruthy() diff --git a/assets/scripts/spec/unit/job_spec.coffee b/assets/scripts/spec/unit/job_spec.coffee index 6f0f264a..2550058b 100644 --- a/assets/scripts/spec/unit/job_spec.coffee +++ b/assets/scripts/spec/unit/job_spec.coffee @@ -1,4 +1,5 @@ store = null +record = null describe 'Travis.Job', -> beforeEach -> @@ -7,6 +8,28 @@ describe 'Travis.Job', -> afterEach -> store.destroy() + describe 'incomplete attributes', -> + beforeEach -> + record = store.loadIncomplete Travis.Job, { id: 1, state: 'started' } + + it 'does not load record on duration, finishedAt and result if job is not in finished state', -> + record.get('_duration') + record.get('finishedAt') + record.get('result') + + waits 50 + runs -> + expect( record.get('complete') ).toBeFalsy() + + it 'loads the rest of the record if it\'s in finished state', -> + record = store.loadIncomplete Travis.Job, { id: 1, state: 'finished' } + record.get('finishedAt') + + waits 50 + runs -> + expect( record.get('complete') ).toBeTruthy() + + describe 'with different number of config keys in sibling jobs', -> beforeEach -> buildAttrs =