|
|
@@ -1,4 +1,9 @@
|
|
|
require 'api_client'
|
|
|
+require './helpers/state_helpers'
|
|
|
+
|
|
|
+RSpec.configure do |c|
|
|
|
+ c.include StateHelpers
|
|
|
+end
|
|
|
|
|
|
RSpec.describe 'State' do
|
|
|
before(:all) do
|
|
|
@@ -12,6 +17,7 @@ RSpec.describe 'State' do
|
|
|
type: 'rgb_cct',
|
|
|
group_id: 1
|
|
|
}
|
|
|
+ @client.delete_state(@id_params)
|
|
|
end
|
|
|
|
|
|
context 'toggle command' do
|
|
|
@@ -32,6 +38,25 @@ RSpec.describe 'State' do
|
|
|
end
|
|
|
end
|
|
|
|
|
|
+ context 'deleting' do
|
|
|
+ it 'should support deleting state' do
|
|
|
+ desired_state = {
|
|
|
+ 'status' => 'ON',
|
|
|
+ 'level' => 10,
|
|
|
+ 'hue' => 49,
|
|
|
+ 'saturation' => 20
|
|
|
+ }
|
|
|
+ @client.patch_state(desired_state, @id_params)
|
|
|
+
|
|
|
+ resulting_state = @client.get_state(@id_params)
|
|
|
+ expect(resulting_state).to_not be_empty
|
|
|
+
|
|
|
+ @client.delete_state(@id_params)
|
|
|
+ resulting_state = @client.get_state(@id_params)
|
|
|
+ expect(resulting_state).to be_empty
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
context 'persistence' do
|
|
|
it 'should persist parameters' do
|
|
|
desired_state = {
|
|
|
@@ -43,8 +68,7 @@ RSpec.describe 'State' do
|
|
|
@client.patch_state(desired_state, @id_params)
|
|
|
patched_state = @client.get_state(@id_params)
|
|
|
|
|
|
- expect(patched_state.keys).to include(*desired_state.keys)
|
|
|
- expect(patched_state.select { |x| desired_state.include?(x) } ).to eq(desired_state)
|
|
|
+ states_are_equal(desired_state, patched_state)
|
|
|
|
|
|
desired_state = {
|
|
|
'status' => 'ON',
|
|
|
@@ -55,8 +79,7 @@ RSpec.describe 'State' do
|
|
|
@client.patch_state(desired_state, @id_params)
|
|
|
patched_state = @client.get_state(@id_params)
|
|
|
|
|
|
- expect(patched_state.keys).to include(*desired_state.keys)
|
|
|
- expect(patched_state.select { |x| desired_state.include?(x) } ).to eq(desired_state)
|
|
|
+ states_are_equal(desired_state, patched_state)
|
|
|
end
|
|
|
|
|
|
it 'should affect member groups when changing group 0' do
|
|
|
@@ -75,35 +98,121 @@ RSpec.describe 'State' do
|
|
|
patched_state = @client.patch_state(individual_state, @id_params)
|
|
|
|
|
|
expect(patched_state).to_not eq(desired_state)
|
|
|
- expect(patched_state.keys).to include(*individual_state.keys)
|
|
|
- expect(patched_state.select { |x| individual_state.include?(x) } ).to eq(individual_state)
|
|
|
+ states_are_equal(individual_state, patched_state)
|
|
|
|
|
|
group_4_state = @client.get_state(group_0_params.merge(group_id: 4))
|
|
|
|
|
|
- expect(group_4_state.keys).to include(*desired_state.keys)
|
|
|
- expect(group_4_state.select { |x| desired_state.include?(x) } ).to eq(desired_state)
|
|
|
+ states_are_equal(desired_state, group_4_state)
|
|
|
|
|
|
@client.patch_state(desired_state, group_0_params)
|
|
|
group_1_state = @client.get_state(group_0_params.merge(group_id: 1))
|
|
|
|
|
|
- expect(group_1_state.keys).to include(*desired_state.keys)
|
|
|
- expect(group_1_state.select { |x| desired_state.include?(x) } ).to eq(desired_state)
|
|
|
+ states_are_equal(desired_state, group_1_state)
|
|
|
end
|
|
|
|
|
|
- # it 'should keep group 0 state' do
|
|
|
- # group_0_params = @id_params.merge(group_id: 0)
|
|
|
- # desired_state = {
|
|
|
- # 'status' => 'ON',
|
|
|
- # 'level' => 100,
|
|
|
- # 'hue' => 0,
|
|
|
- # 'saturation' => 100
|
|
|
- # }
|
|
|
+ it 'should keep group 0 state' do
|
|
|
+ group_0_params = @id_params.merge(group_id: 0)
|
|
|
+ desired_state = {
|
|
|
+ 'status' => 'ON',
|
|
|
+ 'level' => 100,
|
|
|
+ 'hue' => 0,
|
|
|
+ 'saturation' => 100
|
|
|
+ }
|
|
|
+
|
|
|
+ patched_state = @client.patch_state(desired_state, group_0_params)
|
|
|
+
|
|
|
+ states_are_equal(desired_state, patched_state)
|
|
|
+ end
|
|
|
|
|
|
- # patched_state = @client.patch_state(desired_state, group_0_params)
|
|
|
+ it 'should clear group 0 state after member group state changes' do
|
|
|
+ group_0_params = @id_params.merge(group_id: 0)
|
|
|
+ desired_state = {
|
|
|
+ 'status' => 'ON',
|
|
|
+ 'level' => 100,
|
|
|
+ 'kelvin' => 100
|
|
|
+ }
|
|
|
|
|
|
- # expect(patched_state.keys).to include(*desired_state.keys)
|
|
|
- # expect(patched_state.select { |x| desired_state.include?(x) } ).to eq(desired_state)
|
|
|
- # end
|
|
|
+ @client.patch_state(desired_state, group_0_params)
|
|
|
+ @client.patch_state(desired_state.merge('kelvin' => 10), @id_params)
|
|
|
+
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+
|
|
|
+ expect(resulting_state.keys).to_not include('kelvin')
|
|
|
+ states_are_equal(desired_state.reject { |x| x == 'kelvin' }, resulting_state)
|
|
|
+ end
|
|
|
+
|
|
|
+ it 'should not clear group 0 state when updating member group state if value is the same' do
|
|
|
+ group_0_params = @id_params.merge(group_id: 0)
|
|
|
+ desired_state = {
|
|
|
+ 'status' => 'ON',
|
|
|
+ 'level' => 100,
|
|
|
+ 'kelvin' => 100
|
|
|
+ }
|
|
|
+
|
|
|
+ @client.patch_state(desired_state, group_0_params)
|
|
|
+ @client.patch_state(desired_state.merge('kelvin' => 100), @id_params)
|
|
|
+
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+
|
|
|
+ expect(resulting_state).to include('kelvin')
|
|
|
+ states_are_equal(desired_state, resulting_state)
|
|
|
+ end
|
|
|
+
|
|
|
+ it 'changing member state mode and then changing level should preserve group 0 brightness for original mode' do
|
|
|
+ group_0_params = @id_params.merge(group_id: 0)
|
|
|
+ desired_state = {
|
|
|
+ 'status' => 'ON',
|
|
|
+ 'level' => 100,
|
|
|
+ 'hue' => 0,
|
|
|
+ 'saturation' => 100
|
|
|
+ }
|
|
|
+
|
|
|
+ @client.delete_state(group_0_params)
|
|
|
+ @client.patch_state(desired_state, group_0_params)
|
|
|
+
|
|
|
+ # color -> white mode. should not have brightness because brightness will
|
|
|
+ # have been previously unknown to group 0.
|
|
|
+ @client.patch_state(desired_state.merge('color_temp' => 253, 'level' => 11), @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state.keys).to_not include('level')
|
|
|
+
|
|
|
+ # color -> effect mode. same as above
|
|
|
+ @client.patch_state(desired_state, group_0_params)
|
|
|
+ @client.patch_state(desired_state.merge('mode' => 0), @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state).to_not include('level')
|
|
|
+
|
|
|
+ # white mode -> color.
|
|
|
+ white_mode_desired_state = {'status' => 'ON', 'color_temp' => 253, 'level' => 11}
|
|
|
+ @client.patch_state(white_mode_desired_state, group_0_params)
|
|
|
+ @client.patch_state({'hue' => 10}, @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state).to_not include('level')
|
|
|
+
|
|
|
+ @client.patch_state({'hue' => 10}, group_0_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state['level']).to eq(100)
|
|
|
+
|
|
|
+ # white mode -> effect mode. level never set for group 0, so level should
|
|
|
+ # level should be present.
|
|
|
+ @client.patch_state(white_mode_desired_state, group_0_params)
|
|
|
+ @client.patch_state({'mode' => 0}, @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state).to_not include('level')
|
|
|
+
|
|
|
+ # effect mode -> color. same as white mode -> color
|
|
|
+ effect_mode_desired_state = {'status' => 'ON', 'mode' => 0, 'level' => 100}
|
|
|
+ @client.patch_state(effect_mode_desired_state, group_0_params)
|
|
|
+ @client.patch_state({'hue' => 10}, @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state).to_not include('level')
|
|
|
+
|
|
|
+ # effect mode -> white
|
|
|
+ @client.patch_state(effect_mode_desired_state, group_0_params)
|
|
|
+ @client.patch_state({'color_temp' => 253}, @id_params)
|
|
|
+ resulting_state = @client.get_state(group_0_params)
|
|
|
+ expect(resulting_state).to_not include('level')
|
|
|
+ end
|
|
|
end
|
|
|
|
|
|
context 'fields' do
|