Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Configuration/AppConfigurationManager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from Models.AppConfiguration import AppConfiguration
import json

class AppConfigurationManager:
appConfiguration: AppConfiguration = None

def __init__(self):
with open('./appconfig.json', 'rb') as appConfigurationFile:

appConfiguration = json.load(appConfigurationFile)
self.appConfiguration = AppConfiguration(appConfiguration['deviceConfigurationLocalFilePath'])
70 changes: 70 additions & 0 deletions Configuration/DeviceConfigurationManager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import os.path
from Models.DeviceConfiguration import *
from trashtech_api import *
from Configuration.AppConfigurationManager import AppConfigurationManager

class DeviceConfigurationManager:
_configFilePath: str = ''
_deviceConfiguration: DeviceConfiguration = None
_trashtechApi: TrashtechApi = None

def __init__(self, trashtechApi: TrashtechApi, appConfigurationManager: AppConfigurationManager):

if trashtechApi is None:
raise ValueError('ConfigurationManager: Class initialization with not initialized trashtechApi')

if appConfigurationManager is None:
raise ValueError('ConfigurationManager: Class initialization with not initialized appConfigurationManager')

self._configFilePath = appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath
self._trashtechApi = trashtechApi

def LoadFromFile(self) -> DeviceConfiguration:
try:
if os.path.isfile(self._configFilePath):
with open(self._configFilePath, "rb") as configFile:
data = json.load(configFile)

self._deviceConfiguration = DeviceConfiguration(data['photo_interval'],
data['photo_rotation'],
data['photo_width'],
data['photo_height'],
data['custom_resolution'])
return self._deviceConfiguration
else:
return None
except IOError as e:
return None

def TryGetDeviceConfiguration(self) -> DeviceConfiguration:

if self._deviceConfiguration is not None:
return self._deviceConfiguration
else:
localConfig = self.LoadFromFile()

if localConfig is not None:
self._deviceConfiguration = localConfig
return self._deviceConfiguration
else:
self._deviceConfiguration = self._trashtechApi.GetConfiguration()

if self._deviceConfiguration is None:
return None

self.SaveConfiguration()
return self._deviceConfiguration

def SaveConfiguration(self):

if self._deviceConfiguration is None:
return False

try:

with open(self._configFilePath, 'w') as outfile:
json.dump(self._deviceConfiguration, outfile, default=lambda o: o.__dict__)
return True

except Exception as e:
return False
8 changes: 8 additions & 0 deletions Models/AppConfiguration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@


class AppConfiguration:

deviceConfigurationLocalFilePath: str = ''

def __init__(self, deviceConfigurationLocalFilePath: str):
self.deviceConfigurationLocalFilePath = deviceConfigurationLocalFilePath
22 changes: 22 additions & 0 deletions Models/DeviceConfiguration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@


class DeviceConfiguration:

photo_interval: int = -1
photo_rotation: int = -1
photo_width: int = -1
photo_height: int = -1
custom_resolution: bool = False

def __init__(self,
photo_interval,
photo_rotation,
photo_width,
photo_height,
custom_resolution):

self.photo_interval = photo_interval
self.photo_rotation = photo_rotation
self.photo_width = photo_width
self.photo_height = photo_height
self.custom_resolution = custom_resolution
1 change: 1 addition & 0 deletions Tests/Resources/DeviceConfigurationSnapshot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"photo_interval": 3600, "photo_rotation": 0, "photo_width": 640, "photo_height": 480, "custom_resolution": true}
5 changes: 5 additions & 0 deletions Tests/manual
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Crate file with unit tests cases:
-file name should follow this convention test_*.py


python -m pytest tests/ - run this command to run all tests from tests directory
136 changes: 136 additions & 0 deletions Tests/test_DeviceConfigurationManager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import pytest
from Configuration.DeviceConfigurationManager import *
from Configuration.AppConfigurationManager import *
from trashtech_api import *


class TestConfigurationManager:

def test_LoadFromFile_NoneTrashtechApiParameter_Invalid(self):
with pytest.raises(Exception):
# Arange
trashtechApi = None

# Act + Assert
assert DeviceConfigurationManager(trashtechApi, None)

def test_LoadFromFile_NoneAppConfigurationManagerParameter_Invalid(self):
with pytest.raises(Exception):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = None

# Act + Assert
assert DeviceConfigurationManager(trashtechApi, appConfigurationManager)

def test_LoadFromFile_FileDoesNotExsist_Valid(self):

# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = 'blabla.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)

# Act
deviceConfiguration = deviceConfigurationManager.LoadFromFile()

# assert
assert deviceConfiguration is None

def test_LoadFromFile_FileExsist_Valid(self):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)

# Act
deviceConfiguration = deviceConfigurationManager.LoadFromFile()

# assert
assert deviceConfiguration is not None
assert isinstance(deviceConfiguration, DeviceConfiguration)

def test_SaveConfiguration_DeviceConfigLoaded_Valid(self):

# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)
deviceConfiguration = deviceConfigurationManager.LoadFromFile()

# Act
saveResult = deviceConfigurationManager.SaveConfiguration()

# assert
assert saveResult is True

def test_SaveConfiguration_NoneDeviceConfig_Invalid(self):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)

# Act
saveResult = deviceConfigurationManager.SaveConfiguration()

# assert
assert saveResult is False

def test_TryGetDeviceConfiguration_DeviceConfigLoadedAlready_Valid(self):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)
deviceConfiguration = deviceConfigurationManager.LoadFromFile()

# Act
deviceConfiguration = deviceConfigurationManager.TryGetDeviceConfiguration()

# assert
assert deviceConfiguration is not None

def test_TryGetDeviceConfiguration_DeviceConfigLoadedFromDisk_Valid(self):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)

# Act
deviceConfiguration = deviceConfigurationManager.TryGetDeviceConfiguration()

# assert
assert deviceConfiguration is not None

def test_TryGetDeviceConfiguration_DeviceConfigLoadedFromNetwork_Valid(self):
# Arange
trashtechApi = TrashtechApi()
appConfigurationManager = AppConfigurationManager()

appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath = './Tests/Resources/DeviceConfigurationSnapshot1.json'

deviceConfigurationManager = DeviceConfigurationManager(trashtechApi, appConfigurationManager)

# Act
deviceConfiguration = deviceConfigurationManager.TryGetDeviceConfiguration()

# assert
assert deviceConfiguration is not None

os.remove(appConfigurationManager.appConfiguration.deviceConfigurationLocalFilePath)
15 changes: 15 additions & 0 deletions Tests/test_TrashtechApi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import pytest
from trashtech_api import *


class TestTrashTechApi:

def test_GetConfiguration(self):
# Arrange
trashtechApi = TrashtechApi()

# Act
configuration = trashtechApi.GetConfiguration()

# Assert
assert configuration is not None
7 changes: 7 additions & 0 deletions Tests/test_foo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import pytest

def func(x):
return x + 1

def test_answer():
assert func(3) == 4
3 changes: 3 additions & 0 deletions appconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"deviceConfigurationLocalFilePath": "./DeviceConfigurationSnapshot.json"
}
Loading