Skip to content

Commit

Permalink
feat(select_child): Allow next or previous child options
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeSchapp committed Oct 2, 2022
2 parents 505c159 + 914e9f1 commit 643c8a2
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 18 deletions.
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.10.7
micropython-1.19.1
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
"python.analysis.extraPaths": [
".vscode/Pico-W-Stub/stubs"
],
"picowgo.syncFolder": "firmware",
"picowgo.syncFolder": "dist",
"picowgo.openOnStart": true
}
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,8 @@ run_tests:
pytest --cov=firmware/lib
coverage xml
coverage report --fail-under=80

dist:
mkdir -p dist
cp -r firmware/* dist
python -m upip install -r requirements.txt -p 'dist/'
25 changes: 25 additions & 0 deletions firmware/lib/scout.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ def __init__(self, base_url):
self.base_url = base_url
self.children = []
self.init_children()
self.child_index = None

def init_children(self):
path = "children"
Expand Down Expand Up @@ -100,6 +101,30 @@ def bottle_feed(self, child_id):
self.resolve_timers(child_id, activity, data)
print("Recorded Bottle Feeding")

def next_child(self):
if len(self.children) == 0:
raise IndexError("No children setup in BabyBuddy")
if self.child_index == None:
self.child_index = 0
return self.children[0]
max_index = len(self.children) - 1
new_index = self.child_index + 1
if new_index > max_index:
new_index = 0
self.child_index = new_index
return self.children[new_index]

def previous_child(self):
if len(self.children) == 0:
raise IndexError("No children setup in BabyBuddy")
if self.child_index == None:
self.child_index = len(self.children) - 1
return self.children[self.child_index]
new_index = self.child_index - 1
if new_index < 0:
new_index = len(self.children) - 1
self.child_index = new_index
return self.children[new_index]

def connect_to_baby_buddy(base_url):
# Attempt to establish connection to BabyBuddy Instance
Expand Down
4 changes: 2 additions & 2 deletions firmware/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
)
BABY_SCOUT = connect_to_baby_buddy(base_url=WLAN_VARIABLES["BASE_URL"])
# Set default to first child in BabyBuddy, add functionality to allow for toggling between multiple children.
BABY_SCOUT.next_child()
child = BABY_SCOUT.children[0]

# Create button matrix, matching gpio pin to the specific action you want to capture
Expand All @@ -49,15 +50,14 @@
buttons.append(create_button(button))

# Loop through and check if any button has been pressed.

def button_pressed():
while True:
for index, button in enumerate(buttons):
if button.value():
onboard_led(1)
time.sleep(0.5)
onboard_led(0)
button_actions[index](child)
button_actions[index](BABY_SCOUT.children[BABY_SCOUT.child_index])

# Continually check and assure connectivity to wireless and babyscout

Expand Down
76 changes: 62 additions & 14 deletions tests/test_scout.py
Original file line number Diff line number Diff line change
@@ -1,62 +1,54 @@
from unittest.mock import patch
from lib.scout import Scout, connect_to_baby_buddy, send_api_request
import pytest

with patch('lib.scout.send_api_request') as mock_api:
scout = Scout("fake_url")

@patch('lib.scout.send_api_request')
def test_init_scout_children(mock_api_request):
# Test Initializing Scout class
scout.init_children()
mock_api_request.assert_called_with("fake_url", "children")

@patch('lib.scout.send_api_request')
def test_bottle_feed(mock_api_request):
# Test Initializing Scout class
scout.bottle_feed(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'feedings'})

@patch('lib.scout.send_api_request')
def test_right_breast(mock_api_request):
# Test Initializing Scout class
scout.right_breast(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'feedings'})

@patch('lib.scout.send_api_request')
def test_left_breast(mock_api_request):
# Test Initializing Scout class
scout.left_breast(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'feedings'})

@patch('lib.scout.send_api_request')
def test_both_breasts(mock_api_request):
# Test Initializing Scout class
scout.breast_feed(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'feedings'})

@patch('lib.scout.send_api_request')
def test_wet_solid_diaper(mock_api_request):
# Test Initializing Scout class
scout.wet_solid_diaper(0)
mock_api_request.assert_called_with('fake_url', 'changes', data={'wet': True, 'solid': True, 'child': 0})

@patch('lib.scout.send_api_request')
def test_solid_diaper(mock_api_request):
# Test Initializing Scout class
scout.solid_diaper(0)
mock_api_request.assert_called_with('fake_url', 'changes', data={'wet': False, 'solid': True, 'child': 0})

@patch('lib.scout.send_api_request')
def test_wet_diaper(mock_api_request):
# Test Initializing Scout class
scout.wet_diaper(0)
mock_api_request.assert_called_with('fake_url', 'changes', data={'wet': True, 'solid': False, 'child': 0})


@patch('lib.scout.send_api_request')
def test_conect_to_baby_buddy(mock_api_request):
mock_api_request.side_effect = [OSError("test"), {"results": [{"id": 1}]}]
# Test Initializing Scout class
scout = connect_to_baby_buddy('fake_url')
mock_api_request.assert_called_with('fake_url', 'children')

Expand Down Expand Up @@ -86,26 +78,82 @@ def __init__(self):

@patch('lib.scout.send_api_request')
def test_sleep(mock_api_request):
# Test Initializing Scout class
scout.sleep(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'sleep'})

@patch('lib.scout.send_api_request')
def test_tummy_time(mock_api_request):
# Test Initializing Scout class
scout.tummy_time(0)
mock_api_request.assert_called_with('fake_url', path='timers', data={'child': 0, 'name': 'tummy-times'})

@patch('lib.scout.send_api_request')
def test_get_timers(mock_api_request):
mock_api_request.side_effect = [{"results": [{"name": "sleep", "child": 0, "active": True}]}]
# Test Initializing Scout class
timer = scout.get_timer(0, "sleep")
assert timer == {'active': True, 'child': 0, 'name': 'sleep'}

@patch('lib.scout.send_api_request')
def test_resolve_timers_current_timer(mock_api_request):
mock_api_request.side_effect = [{"results": [{"name": "sleep", "child": 0, "active": True, "id": 0}]}, None]
# Test Initializing Scout class
timer = scout.resolve_timers(0, "sleep", {"timer": 0})
assert timer == None
assert timer == None

@patch('lib.scout.send_api_request')
def test_next_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}]}]
scout = Scout("fake_url")
next_child = scout.next_child()
assert next_child == 3

@patch('lib.scout.send_api_request')
def test_next_child_no_children(mock_api_request):
scout = Scout("fake_url")
with pytest.raises(IndexError) as e:
next_child = scout.next_child()

@patch('lib.scout.send_api_request')
def test_next_next_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}, {"id": 5}]}]
scout = Scout("fake_url")
next_child = scout.next_child()
next_child = scout.next_child()
assert next_child == 5

@patch('lib.scout.send_api_request')
def test_next_put_of_index_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}, {"id": 5}]}]
scout = Scout("fake_url")
next_child = scout.next_child()
next_child = scout.next_child()
next_child = scout.next_child()
assert next_child == 3

@patch('lib.scout.send_api_request')
def test_previous_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}, {"id": 5}]}]
scout = Scout("fake_url")
previous_child = scout.previous_child()
assert previous_child == 5

@patch('lib.scout.send_api_request')
def test_previous_child_no_children(mock_api_request):
scout = Scout("fake_url")
with pytest.raises(IndexError) as e:
previous_child = scout.previous_child()

@patch('lib.scout.send_api_request')
def test_previous_previous_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}, {"id": 5}]}]
scout = Scout("fake_url")
previous_child = scout.previous_child()
previous_child = scout.previous_child()
assert previous_child == 3

@patch('lib.scout.send_api_request')
def test_previous_out_of_index_child(mock_api_request):
mock_api_request.side_effect = [{"results": [{"id": 3}, {"id": 5}]}]
scout = Scout("fake_url")
previous_child = scout.previous_child()
previous_child = scout.previous_child()
previous_child = scout.previous_child()
assert previous_child == 5

0 comments on commit 643c8a2

Please sign in to comment.