Skip to content

Commit

Permalink
rewrite to remove mqtt and send notification to ntfy, no longer runs …
Browse files Browse the repository at this point in the history
…in loop and takes commandline arguments
  • Loading branch information
joe-mccarthy committed Sep 13, 2024
1 parent efbae73 commit f8c39f1
Show file tree
Hide file tree
Showing 23 changed files with 114 additions and 218 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,4 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

.vscode/
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
![GitHub commits since latest release](https://img.shields.io/github/commits-since/joe-mccarthy/harlow-bindicator/latest?cacheSeconds=1)
![GitHub License](https://img.shields.io/github/license/joe-mccarthy/harlow-bindicator?cacheSeconds=1)

```bash
sudo apt-get install chromium-chromedriver
```

## Contributing

Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
Expand Down
13 changes: 0 additions & 13 deletions config.ini

This file was deleted.

26 changes: 0 additions & 26 deletions harlow_bindicator/app/bindicator.py

This file was deleted.

14 changes: 0 additions & 14 deletions harlow_bindicator/app/configuration.py

This file was deleted.

25 changes: 0 additions & 25 deletions harlow_bindicator/app/mqtt.py

This file was deleted.

26 changes: 0 additions & 26 deletions harlow_bindicator/main.py

This file was deleted.

File renamed without changes.
File renamed without changes.
7 changes: 3 additions & 4 deletions harlow_bindicator/app/api.py → src/app/api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import List

from .browser import Browser
from .configuration import Configuration
from .data import CollectionDate
from .page_parser import Parser

Expand All @@ -10,9 +9,9 @@ class Api:

url: str = "https://selfserve.harlow.gov.uk/appshost/firmstep/self/apps/custompage/bincollectionsecho?uprn="

def __init__(self, configuration: Configuration) -> None:
self.configuration = configuration
self.browser = Browser(configuration, self.url)
def __init__(self, uprn) -> None:
self.uprn = uprn
self.browser = Browser(uprn, self.url)

def get_data(self) -> List[CollectionDate]:
page_source = self.browser.get_web_page()
Expand Down
27 changes: 27 additions & 0 deletions src/app/bindicator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import logging

from .api import Api
from datetime import date
import requests

class Bindicator:

api: Api

def __init__(self, uprn, topic) -> None:
self.api = Api(uprn)
self.topic = topic

def run(self):
collections = self.api.get_data()

if collections:
logging.debug(
f'{len(collections)} found publishing first collection date information')
if date.today() == collections[0].date:
message = f'Bin collection is today for {collections[0].wheelie.bin_type}'
logging.info(message )
requests.post(f"https://ntfy.sh/{self.topic}",data=message.encode(encoding='utf-8'))
else:
logging.info(
f'Next bin collection is {collections[0].date}, {collections[0].wheelie.bin_type}')
8 changes: 3 additions & 5 deletions harlow_bindicator/app/browser.py → src/app/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,15 @@
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

from .configuration import Configuration


class Browser:

def __init__(self, configuration: Configuration, url: str) -> None:
self.configuration = configuration
def __init__(self, uprn, url: str) -> None:
self.url = url
self.uprn = uprn

def get_web_page(self) -> str:
data_url = f"{self.url}{self.configuration.uprn}"
data_url = f"{self.url}{self.uprn}"

chrome_options = Options()
options = [
Expand Down
File renamed without changes.
File renamed without changes.
25 changes: 25 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import logging
import argparse

from app.bindicator import Bindicator

if __name__ == "__main__":

logging.basicConfig(
level="INFO",
format="%(asctime)s | %(levelname)-8s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)

logging.info('Creating Harlow Bindicator')
parser = argparse.ArgumentParser(description="Environment Checker")
parser.add_argument(
"--uprn", type=str, required=True, help="Property Reference Number"
)
parser.add_argument(
"--topic", type=str, required=True, help="Ntfy Topic"
)
args = parser.parse_args()
bindicator = Bindicator(args.uprn, args.topic)
bindicator.run()
logging.info('Harlow Bindicator run completed')
15 changes: 6 additions & 9 deletions tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
from unittest.mock import patch

from harlow_bindicator.app.api import Api
from harlow_bindicator.app.configuration import Configuration
from src.app.api import Api


def test_init():
config = Configuration()
api = Api(config)
assert api.configuration
api = Api(uprn="123456789")
assert api.uprn == "123456789"


@patch("harlow_bindicator.app.api.Parser")
@patch("harlow_bindicator.app.api.Browser")
@patch("src.app.api.Parser")
@patch("src.app.api.Browser")
def test_browser_and_parser_called(mock_browser, mock_parser):
config = Configuration()
api = Api(config)
api = Api(uprn="123456789")
mock_browser().get_web_page.return_value = "page_source"
mock_parser().parse.return_value = ["data"]

Expand Down
63 changes: 31 additions & 32 deletions tests/test_bindicator.py
Original file line number Diff line number Diff line change
@@ -1,55 +1,54 @@
from unittest.mock import patch

import pytest
from datetime import date, timedelta

from harlow_bindicator.app.bindicator import Bindicator
from harlow_bindicator.app.configuration import Configuration
from harlow_bindicator.app.data import Collection, CollectionDate

from src.app.bindicator import Bindicator
from src.app.data import Collection, CollectionDate

def test_bindicator_init():
with pytest.raises(Exception):
with pytest.raises(TypeError):
Bindicator()


@patch("harlow_bindicator.app.bindicator.MQTT")
def test_bindicator_init_config(mock_mqtt):
config = Configuration()
bindicator = Bindicator(config)

assert bindicator
assert bindicator.configuration
assert bindicator.mqtt_client
assert bindicator.api
mock_mqtt.called_once_with(config)

@patch("src.app.bindicator.Api")
def test_bindicator_run_no_collections(mock_api):
bindicator = Bindicator("uprn", "topic")
mock_api().get_data.return_value = None
bindicator.run()
mock_api().get_data.assert_called_once()

@patch("harlow_bindicator.app.bindicator.MQTT")
@patch("harlow_bindicator.app.bindicator.Api")
def test_bindicator_run_no_collections(mock_api, mock_mqtt):
config = Configuration()
bindicator = Bindicator(config)

mock_api().get_data.return_value = None
@patch("src.app.bindicator.Api")
@patch("src.app.bindicator.requests")
def test_bindicator_run_collections(mock_requests,mock_api):
bindicator = Bindicator("uprn", "topic")
today = date.today()
collection = Collection("recycling", today.strftime("%d/%m/%Y"))
collection_date = CollectionDate(collection)
mock_api().get_data.return_value = [collection_date]

bindicator.run()

mock_api().get_data.called_once()
assert not mock_mqtt().publish.called
mock_api().get_data.assert_called_once()
mock_requests.post.assert_called_once_with(
f"https://ntfy.sh/topic",
data=f"Bin collection is today for {collection_date.wheelie.bin_type}".encode(encoding='utf-8')
)


@patch("harlow_bindicator.app.bindicator.MQTT")
@patch("harlow_bindicator.app.bindicator.Api")
def test_bindicator_run_collections(mock_api, mock_mqtt):
config = Configuration()
bindicator = Bindicator(config)
@patch("src.app.bindicator.Api")
@patch("src.app.bindicator.requests")
def test_no_collection_today(mock_requests,mock_api):
bindicator = Bindicator("uprn", "topic")

collection = Collection("recycling", "15/1/2023")
future_date = (date.today() + timedelta(days=1)).strftime("%d/%m/%Y")
collection = Collection("recycling", future_date)
collection_date = CollectionDate(collection)
mock_api().get_data.return_value = [collection_date]
expected = '{"date": "15/01/2023", "bin_day": false, "bin_type": "recycling"}'

bindicator.run()

mock_api().get_data.called_once()
mock_mqtt().publish.called_once_with(expected)
mock_api().get_data.assert_called_once()
mock_requests.post.assert_not_called()
24 changes: 10 additions & 14 deletions tests/test_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,37 @@
import pytest
from selenium.webdriver import Chrome

from harlow_bindicator.app.browser import Browser
from harlow_bindicator.app.configuration import Configuration
from src.app.browser import Browser


def test_construtor():
def test_constructor():
with pytest.raises(Exception):
Browser()


def test_constructor_with_configuration():
config = Configuration()
browser = Browser(config, "test_url")
assert browser.configuration == config
browser = Browser("123456", "test_url")
assert browser.uprn == "123456"
assert browser.url == "test_url"


@patch("harlow_bindicator.app.browser.webdriver")
@patch("src.app.browser.webdriver")
def test_get_data(web_driver):
config = Configuration()
browser = Browser(config, "test_url")
browser = Browser("123456", "test_url")
chrome = MagicMock(spec=Chrome)
web_driver.Chrome.return_value = chrome
chrome.page_source = "page_data"
source = browser.get_web_page()

assert source == "page_data"
chrome.get.assert_called_once_with("test_url00000000001")
chrome.get.assert_called_once_with("test_url123456")


@patch("harlow_bindicator.app.browser.webdriver")
@patch("src.app.browser.webdriver")
def test_get_data_simple_mocks(web_driver):
config = Configuration()
browser = Browser(config, "test_url")
browser = Browser("123456", "test_url")
web_driver.Chrome().page_source = "page_data"
source = browser.get_web_page()

assert source == "page_data"
web_driver.Chrome().get.assert_called_once_with("test_url00000000001")
web_driver.Chrome().get.assert_called_once_with("test_url123456")
Loading

0 comments on commit f8c39f1

Please sign in to comment.