diff --git a/.phpunit.result.cache b/.phpunit.result.cache
new file mode 100644
index 000000000..73fc8c1f0
--- /dev/null
+++ b/.phpunit.result.cache
@@ -0,0 +1 @@
+{"version":1,"defects":{"Tests\\System\\Classes\\NavigationTest::testRegisterNavItems":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate layouts":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate views":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate partials":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate model config files":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate asset files":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (default) layout":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (edit) view":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (flash) partial":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find controller config file":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find asset file":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it runs the requested controller action":3,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it runs the requested controller handler":3,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/BaseWidgetTest.php::it has defined paths to locate widget partials":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/BaseWidgetTest.php::it has defined paths to locate widget asset files":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/CategoryTest.php::it can create a category and assign it to a location":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/CategoryTest.php::it should fail to create a category when no name is provided":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no name is provided":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no email is provided":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no address line 1 is provided":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should be able to create and delete a location":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should be able to get and set a location option":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should create a latitude and longitude for the location when requested and address data is provided":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location with a duplicate slug":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by status":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by offer delivery":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by offer collection":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should sort locations alphabetically by name ascending":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should sort locations alphabetically by name descending":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it can be made default":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it creates a new record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it retrieves an existing record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates an existing record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it deletes an existing record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it creates options values with new record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates options values on existing record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it deletes options values on existing record":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it attach an existing record to a menu item":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates options values on related menu item":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CategoryTest.php::it has rules for name input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CategoryTest.php::it has rules for permalink slug input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerGroupTest.php::it has rules for group_name field":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerGroupTest.php::it has rules for description field":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for first_name field":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for last_name field":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for email field":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/IngredientTest.php::it has rules for name input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/IngredientTest.php::it has rules for description input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has required rule for location_name, location_email and ...":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has sometimes rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has max characters rule for mealtime_name input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has unique rule for mealtime_name input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has valid_time rule for start_time and end_time input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_name":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_price":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_description":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has valid_date and valid_time rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has in:order,reservation rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has rules for table_name input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has min character rule for min_capacity and max_capacity input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has rules for max_capacity input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserGroupTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserGroupTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has alpha_dash rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has unique:admin_user_roles rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has sometimes rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has unique rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/ExampleTest.php::example":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Flame\/Filesystem\/FilesystemTest.php::it symbolizes path":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Flame\/Router\/RouterTest.php::it converts a pagic route uri to laravel style":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/IgniterTest.php::it checks for admin routes":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it finds assets file in active theme directory":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it runs the requested page":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it runs the requested page handler":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders the requested page contents":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a defined component":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a component partial contents":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a theme partial contents":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a theme content contents":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it rewrites page path to page url":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/RouterTest.php::it finds a theme page":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/RouterTest.php::it rewrites page path to url":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it loads test theme":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it has active theme":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it finds a theme file":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it fails when theme file does not exist":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it writes a theme file":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it renames a theme file":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it deletes a theme file":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it extracts a theme archive":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it deletes a theme directory":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it installs a theme":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it creates a child theme":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it validates a theme configuration":1,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Template\/PageTest.php::it reads page settings from pages.yml":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Classes\/MailManagerTest.php::it renders mail templates":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Models\/MailThemeTest.php::it compiles theme default css file":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CountryTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CountryTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CurrencyTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CurrencyTest.php::it has max characters rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has unique rule for code input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has max characters rule for code input":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/MailLayoutTest.php::it has required rule for inputs":4,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/MailLayoutTest.php::it has max characters rule for code input":4},"times":{"Tests\\System\\Classes\\NavigationTest::testRegisterNavItems":2.461,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate layouts":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate views":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate partials":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate model config files":0.012,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it has defined paths to locate asset files":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (default) layout":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (edit) view":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find (flash) partial":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find controller config file":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it can find asset file":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it runs the requested controller action":0.02,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/AdminControllerTest.php::it runs the requested controller handler":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/BaseWidgetTest.php::it has defined paths to locate widget partials":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Classes\/BaseWidgetTest.php::it has defined paths to locate widget asset files":0.009,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/CategoryTest.php::it can create a category and assign it to a location":0.01,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/CategoryTest.php::it should fail to create a category when no name is provided":0.019,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no name is provided":0.086,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no email is provided":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location when no address line 1 is provided":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should be able to create and delete a location":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should be able to get and set a location option":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should create a latitude and longitude for the location when requested and address data is provided":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should fail to create a location with a duplicate slug":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by status":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by offer delivery":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should filter locations by offer collection":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should sort locations alphabetically by name ascending":0.02,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it should sort locations alphabetically by name descending":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/LocationTest.php::it can be made default":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it creates a new record":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it retrieves an existing record":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates an existing record":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it deletes an existing record":0.011,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it creates options values with new record":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates options values on existing record":0.012,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it deletes options values on existing record":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it attach an existing record to a menu item":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Models\/MenuOptionTest.php::it updates options values on related menu item":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CategoryTest.php::it has rules for name input":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CategoryTest.php::it has rules for permalink slug input":0.019,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerGroupTest.php::it has rules for group_name field":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerGroupTest.php::it has rules for description field":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for first_name field":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for last_name field":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/CustomerTest.php::it has rules for email field":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/IngredientTest.php::it has rules for name input":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/IngredientTest.php::it has rules for description input":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has required rule for location_name, location_email and ...":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has sometimes rule for inputs":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/LocationTest.php::it has max characters rule for inputs":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has required rule for inputs":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has max characters rule for mealtime_name input":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has unique rule for mealtime_name input":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MealtimeTest.php::it has valid_time rule for start_time and end_time input":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_name":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_price":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/MenuTest.php::it has rules for menu_description":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has required rule for inputs":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has max characters rule for inputs":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/ReservationTest.php::it has valid_date and valid_time rule for inputs":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has required rule for inputs":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has max characters rule for inputs":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/StatusTest.php::it has in:order,reservation rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has required rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has rules for table_name input":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has min character rule for min_capacity and max_capacity input":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/TableTest.php::it has rules for max_capacity input":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserGroupTest.php::it has required rule for inputs":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserGroupTest.php::it has max characters rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has required rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has max characters rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has alpha_dash rule for inputs":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserRoleTest.php::it has unique:admin_user_roles rule for inputs":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has required rule for inputs":0.019,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has sometimes rule for inputs":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has max characters rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Admin\/Requests\/UserTest.php::it has unique rule for inputs":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/ExampleTest.php::example":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Flame\/Filesystem\/FilesystemTest.php::it symbolizes path":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Flame\/Router\/RouterTest.php::it converts a pagic route uri to laravel style":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/IgniterTest.php::it checks for admin routes":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it finds assets file in active theme directory":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it runs the requested page":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it runs the requested page handler":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders the requested page contents":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a defined component":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a component partial contents":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a theme partial contents":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it renders a theme content contents":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/MainControllerTest.php::it rewrites page path to page url":0.022,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/RouterTest.php::it finds a theme page":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/RouterTest.php::it rewrites page path to url":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it loads test theme":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it has active theme":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it finds a theme file":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it fails when theme file does not exist":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it writes a theme file":0.013,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it renames a theme file":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it deletes a theme file":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it extracts a theme archive":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it deletes a theme directory":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it installs a theme":0.015,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it creates a child theme":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Classes\/ThemeManagerTest.php::it validates a theme configuration":0.014,"\/Users\/ryan\/Git Repos\/flame\/tests\/Main\/Template\/PageTest.php::it reads page settings from pages.yml":0.019,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Classes\/MailManagerTest.php::it renders mail templates":0.048,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Models\/MailThemeTest.php::it compiles theme default css file":0.022,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CountryTest.php::it has required rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CountryTest.php::it has max characters rule for inputs":0.02,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CurrencyTest.php::it has required rule for inputs":0.018,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/CurrencyTest.php::it has max characters rule for inputs":0.019,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has required rule for inputs":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has unique rule for code input":0.017,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/LanguageTest.php::it has max characters rule for code input":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/MailLayoutTest.php::it has required rule for inputs":0.016,"\/Users\/ryan\/Git Repos\/flame\/tests\/System\/Requests\/MailLayoutTest.php::it has max characters rule for code input":0.019}}
\ No newline at end of file
diff --git a/phpunit.xml b/phpunit.xml
index 79f7943db..731f74bae 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -24,7 +24,7 @@
-
-
+
+
diff --git a/src/Admin/Database/Factories/LocationFactory.php b/src/Admin/Database/Factories/LocationFactory.php
index a573cc72b..66b40360d 100644
--- a/src/Admin/Database/Factories/LocationFactory.php
+++ b/src/Admin/Database/Factories/LocationFactory.php
@@ -18,8 +18,9 @@ public function definition(): array
'location_lat' => $this->faker->latitude,
'location_lng' => $this->faker->longitude,
'options' => [
- 'auto_lat_lng' => FALSE,
+ 'auto_lat_lng' => false,
],
+ 'location_status' => $this->faker->boolean,
];
}
}
diff --git a/src/Admin/Requests/Location.php b/src/Admin/Requests/Location.php
index 077be5613..8c9705081 100644
--- a/src/Admin/Requests/Location.php
+++ b/src/Admin/Requests/Location.php
@@ -46,7 +46,7 @@ public function rules()
'location_lng' => ['sometimes', 'numeric'],
'description' => ['max:3028'],
'location_status' => ['boolean'],
- 'permalink_slug' => ['alpha_dash', 'max:255'],
+ 'permalink_slug' => ['alpha_dash', 'max:255', 'unique:locations'],
'options.gallery.title' => ['string', 'max:128'],
'options.gallery.description' => ['string', 'max:255'],
'delivery_areas' => ['array'],
diff --git a/src/Admin/Traits/Locationable.php b/src/Admin/Traits/Locationable.php
index 065d632de..63e386dc8 100644
--- a/src/Admin/Traits/Locationable.php
+++ b/src/Admin/Traits/Locationable.php
@@ -5,6 +5,7 @@
use Igniter\Admin\Facades\AdminAuth;
use Igniter\Admin\Facades\AdminLocation;
use Igniter\Flame\Exception\ApplicationException;
+use Igniter\Flame\Igniter;
trait Locationable
{
diff --git a/src/Flame/Geolite/Geocoder.php b/src/Flame/Geolite/Geocoder.php
index 62750a931..9ab24dd9e 100644
--- a/src/Flame/Geolite/Geocoder.php
+++ b/src/Flame/Geolite/Geocoder.php
@@ -135,7 +135,7 @@ public function makeProvider($name): AbstractProvider
*/
public function getDefaultDriver()
{
- return $this->container['config']['geocoder.default'] ?? 'nominatim';
+ return $this->container['config']['igniter.geocoder.default'] ?? 'nominatim';
}
protected function createProvider($name)
@@ -154,21 +154,21 @@ protected function createProvider($name)
protected function createChainProvider()
{
- $providers = $this->container['config']['geocoder.providers'];
+ $providers = $this->container['config']['igniter.geocoder.providers'];
return new Provider\ChainProvider($this, $providers);
}
protected function createNominatimProvider()
{
- $config = $this->container['config']['geocoder.providers.nominatim'];
+ $config = $this->container['config']['igniter.geocoder.providers.nominatim'];
return new Provider\NominatimProvider(new Client, $config);
}
protected function createGoogleProvider()
{
- $config = $this->container['config']['geocoder.providers.google'];
+ $config = $this->container['config']['igniter.geocoder.providers.google'];
return new Provider\GoogleProvider(new Client, $config);
}
diff --git a/src/Flame/Providers/SystemServiceProvider.php b/src/Flame/Providers/SystemServiceProvider.php
index d7152ac47..47e20f316 100644
--- a/src/Flame/Providers/SystemServiceProvider.php
+++ b/src/Flame/Providers/SystemServiceProvider.php
@@ -251,33 +251,33 @@ protected function addTranslationDriver()
protected function setConfiguration()
{
Event::listen('currency.beforeRegister', function () {
- app('config')->set('currency.default', setting('default_currency_code'));
- app('config')->set('currency.converter', setting('currency_converter.api', 'openexchangerates'));
- app('config')->set('currency.converters.openexchangerates.apiKey', setting('currency_converter.oer.apiKey'));
- app('config')->set('currency.converters.fixerio.apiKey', setting('currency_converter.fixerio.apiKey'));
- app('config')->set('currency.ratesCacheDuration', setting('currency_converter.refreshInterval'));
- app('config')->set('currency.model', \Igniter\System\Models\Currency::class);
+ app('config')->set('igniter.currency.default', setting('default_currency_code'));
+ app('config')->set('igniter.currency.converter', setting('currency_converter.api', 'openexchangerates'));
+ app('config')->set('igniter.currency.converters.openexchangerates.apiKey', setting('currency_converter.oer.apiKey'));
+ app('config')->set('igniter.currency.converters.fixerio.apiKey', setting('currency_converter.fixerio.apiKey'));
+ app('config')->set('igniter.currency.ratesCacheDuration', setting('currency_converter.refreshInterval'));
+ app('config')->set('igniter.currency.model', \Igniter\System\Models\Currency::class);
});
$this->app->resolving('translator.localization', function ($localization, $app) {
- $app['config']->set('localization.locale', setting('default_language', $app['config']['app.locale']));
- $app['config']->set('localization.supportedLocales', setting('supported_languages', []) ?: ['en']);
- $app['config']->set('localization.detectBrowserLocale', (bool)setting('detect_language', false));
+ $app['config']->set('igniter.localization.locale', setting('default_language', $app['config']['app.locale']));
+ $app['config']->set('igniter.localization.supportedLocales', setting('supported_languages', []) ?: ['en']);
+ $app['config']->set('igniter.localization.detectBrowserLocale', (bool)setting('detect_language', false));
});
$this->app->resolving('geocoder', function ($geocoder, $app) {
- $app['config']->set('geocoder.default', setting('default_geocoder'));
+ $app['config']->set('igniter.geocoder.default', setting('default_geocoder'));
$region = $app['country']->getCountryCodeById(setting('country_id'));
- $app['config']->set('geocoder.providers.google.region', $region);
- $app['config']->set('geocoder.providers.nominatim.region', $region);
+ $app['config']->set('igniter.geocoder.providers.google.region', $region);
+ $app['config']->set('igniter.geocoder.providers.nominatim.region', $region);
- $app['config']->set('geocoder.providers.google.apiKey', setting('maps_api_key'));
- $app['config']->set('geocoder.precision', setting('geocoder_boundary_precision', 8));
+ $app['config']->set('igniter.geocoder.providers.google.apiKey', setting('maps_api_key'));
+ $app['config']->set('igniter.geocoder.precision', setting('geocoder_boundary_precision', 8));
});
Event::listen(CommandStarting::class, function () {
- config()->set('system.activityRecordsTTL', (int)setting('activity_log_timeout', 60));
+ config()->set('igniter.system.activityRecordsTTL', (int)setting('activity_log_timeout', 60));
});
}
diff --git a/src/Flame/Translation/Localization.php b/src/Flame/Translation/Localization.php
index b34a67e10..ecae49496 100644
--- a/src/Flame/Translation/Localization.php
+++ b/src/Flame/Translation/Localization.php
@@ -139,6 +139,6 @@ public function getBrowserLocale()
protected function getConfig(string $string)
{
- return $this->config['localization.'.$string];
+ return $this->config['igniter.localization.'.$string];
}
}
diff --git a/src/System/Libraries/Country.php b/src/System/Libraries/Country.php
index 098cc0d5f..b53de31fc 100644
--- a/src/System/Libraries/Country.php
+++ b/src/System/Libraries/Country.php
@@ -46,10 +46,18 @@ public function addressFormat($address, $useLineBreaks = true)
)
);
+ while (stripos($formattedAddress, '
') !== false) {
+ $formattedAddress = str_replace('
', '
', $formattedAddress);
+ }
+
+ if (substr($formattedAddress, -6) == '
') {
+ $formattedAddress = substr($formattedAddress, 0, -6);
+ }
+
if (!$useLineBreaks)
$formattedAddress = str_replace('
', ', ', $formattedAddress);
- return $formattedAddress;
+ return trim($formattedAddress);
}
public function getCountryNameById($id = null)
diff --git a/tests/Admin/Models/LocationTest.php b/tests/Admin/Models/LocationTest.php
new file mode 100644
index 000000000..9db2d1a9b
--- /dev/null
+++ b/tests/Admin/Models/LocationTest.php
@@ -0,0 +1,195 @@
+make();
+ $location->location_name = null;
+ $location->save();
+ $this->assertFalse(true);
+ }
+ catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
+
+it('should fail to create a location when no email is provided', function () {
+ try {
+ $location = Location::factory()->make();
+ $location->location_email = null;
+ $location->save();
+ $this->assertFalse(true);
+ }
+ catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
+
+it('should fail to create a location when no address line 1 is provided', function () {
+ try {
+ $location = Location::factory()->make();
+ $location->location_address_1 = null;
+ $location->save();
+ $this->assertFalse(true);
+ }
+ catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
+
+it('should be able to create and delete a location', function () {
+ $location = Location::factory()->make();
+ $location->save();
+
+ $location->delete();
+
+ $this->assertNull($location->fresh());
+});
+
+it('should be able to get and set a location option', function () {
+ $location = Location::factory()->make();
+ $location->save();
+
+ $location->setOption('test_option', true);
+
+ $this->assertNotNull($location->getOption('test_option'));
+});
+
+it('should create a latitude and longitude for the location when requested and address data is provided', function () {
+ $location = Location::factory()->make();
+ $location->setOption('auto_lat_lng', true);
+ $location->location_address_1 = '53 Church Road';
+ $location->location_city = 'London';
+ $location->location_postcode = 'SE19 2TJ';
+ $location->location_lat = null;
+ $location->location_lng = null;
+ $location->save();
+
+ $this->assertNotNull($location->location_lat);
+ $this->assertNotNull($location->location_lng);
+});
+
+it('should fail to create a location with a duplicate slug', function () {
+ $location1 = Location::factory()->make();
+ $location1->permalink_slug = 'test';
+ $location1->save();
+
+ $location2 = Location::factory()->make();
+ $location2->permalink_slug = 'test';
+ $location2->save();
+
+ $this->assertFalse(true);
+});
+
+it('should filter locations by status', function () {
+ $location1 = Location::factory()->make();
+ $location1->location_status = true;
+ $location1->save();
+
+ $location2 = Location::factory()->make();
+ $location2->location_status = false;
+ $location2->save();
+
+ $locations = Location::query()->isEnabled()->get();
+
+ $this->assertCount(1, $locations);
+});
+
+it('should filter locations by offer delivery', function () {
+ $location1 = Location::factory()->make();
+ $location1->save();
+ $location1->setOption('offer_delivery', true);
+
+ $location2 = Location::factory()->make();
+ $location2->save();
+ $location2->setOption('offer_delivery', false);
+
+ $locations = Location::query()->listFrontEnd([
+ 'hasDelivery' => true,
+ 'pageLimit' => null,
+ ])->get();
+
+ $this->assertCount(1, $locations);
+});
+
+it('should filter locations by offer collection', function () {
+ $location1 = Location::factory()->make();
+ $location1->save();
+ $location1->setOption('offer_collection', false);
+
+ $location2 = Location::factory()->make();
+ $location2->save();
+ $location2->setOption('offer_collection', true);
+
+ $locations = Location::query()->listFrontEnd([
+ 'hasCollection' => true,
+ 'pageLimit' => null,
+ ])->get();
+
+ $this->assertCount(1, $locations);
+});
+
+it('should sort locations alphabetically by name ascending', function () {
+ $location1 = Location::factory()->make();
+ $location1->location_name = 'Test 1';
+ $location1->save();
+
+ $location2 = Location::factory()->make();
+ $location2->location_name = 'A Test 2';
+ $location2->save();
+
+ $locations = Location::query()->listFrontEnd([
+ 'hasCollection' => true,
+ 'pageLimit' => null,
+ 'sort' => 'location_name asc',
+ ])->get();
+
+ $this->assertSame($locations->first()->location_name, $location2->location_name);
+});
+
+it('should sort locations alphabetically by name descending', function () {
+ $location1 = Location::factory()->make();
+ $location1->location_name = 'Test 1';
+ $location1->save();
+
+ $location2 = Location::factory()->make();
+ $location2->location_name = 'A Test 2';
+ $location2->save();
+
+ $locations = Location::query()->listFrontEnd([
+ 'hasCollection' => true,
+ 'pageLimit' => null,
+ 'sort' => 'location_name desc',
+ ])->get();
+
+ $this->assertSame($locations->first()->location_name, $location1->location_name);
+});
+
+it('can be made default when enabled', function () {
+ $location = Location::factory()->make();
+ $location->location_status = true;
+ $location->save();
+
+ $location->makeDefault();
+
+ $this->assertSame(Location::getDefault()->getKey(), $location->getKey());
+});
+
+it('cant be made default when not enabled', function () {
+ try {
+
+ $location = Location::factory()->make();
+ $location->location_status = false;
+ $location->save();
+
+ $location->makeDefault();
+
+ $this->assertNotSame(Location::getDefault()->getKey(), $location->getKey());
+
+ } catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
diff --git a/tests/Admin/Models/MealtimeTest.php b/tests/Admin/Models/MealtimeTest.php
new file mode 100644
index 000000000..1cd5636b3
--- /dev/null
+++ b/tests/Admin/Models/MealtimeTest.php
@@ -0,0 +1,97 @@
+delete();
+});
+
+it('should fail to create a mealtime when no name is provided', function () {
+ try {
+ $mealtime = Mealtime::factory()->make();
+ $mealtime->mealtime_name = null;
+ $mealtime->save();
+ $this->assertFalse(true);
+ }
+ catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
+
+it('should be able to create and delete a mealtime', function () {
+ $mealtime = Mealtime::factory()->make();
+ $mealtime->save();
+
+ $mealtime->delete();
+
+ $this->assertNull($mealtime->fresh());
+});
+
+it('should filter mealtimes by status', function () {
+ $mealtime1 = Mealtime::factory()->make();
+ $mealtime1->mealtime_status = true;
+ $mealtime1->save();
+
+ $mealtime2 = Mealtime::factory()->make();
+ $mealtime2->mealtime_status = false;
+ $mealtime2->save();
+
+ $mealtimes = Mealtime::query()->isEnabled()->get();
+
+ $this->assertCount(1, $mealtimes);
+});
+
+it('should be able to return mealtimes available now', function () {
+ $mealtime1 = Mealtime::factory()->make();
+ $mealtime1->mealtime_name = 'Mealtime 1';
+ $mealtime1->start_time = Carbon::now()->subHour(1)->format('H:m');
+ $mealtime1->end_time = Carbon::now()->addHour(1)->format('H:m');
+ $mealtime1->save();
+
+ $mealtime2 = Mealtime::factory()->make();
+ $mealtime2->mealtime_name = 'Mealtime 2';
+ $mealtime2->start_time = Carbon::now()->subHour(4)->format('H:m');
+ $mealtime2->end_time = Carbon::now()->subHour(3)->format('H:m');
+ $mealtime2->save();
+
+ $availableMealtimes = Mealtime::all()->filter->isAvailable();
+
+ $this->assertCount(1, $availableMealtimes);
+});
+
+it('should be able to return mealtimes available at a given time', function () {
+ $mealtime1 = Mealtime::factory()->make();
+ $mealtime1->mealtime_name = 'Mealtime 1';
+ $mealtime1->start_time = Carbon::now()->subHour(1)->format('H:i');
+ $mealtime1->end_time = Carbon::now()->addHour(1)->format('H:i');
+ $mealtime1->save();
+
+ $mealtime2 = Mealtime::factory()->make();
+ $mealtime2->mealtime_name = 'Mealtime 2';
+ $mealtime2->start_time = Carbon::now()->subHour(4)->format('H:i');
+ $mealtime2->end_time = Carbon::now()->subHour(3)->format('H:i');
+ $mealtime2->save();
+
+ $availableMealtimes = Mealtime::all()->filter->isAvailable(Carbon::now()->subHour(2));
+ $this->assertCount(0, $availableMealtimes);
+
+ $availableMealtimes = Mealtime::all()->filter->isAvailable(Carbon::now()->subHour(3)->subMinute(15));
+ $this->assertCount(1, $availableMealtimes);
+});
+
+it('should be able to attach a mealtime to a location', function () {
+ $location = Location::factory()->make();
+ $location->save();
+
+ $mealtime = Mealtime::factory()->make();
+ $mealtime->save();
+
+ $mealtime->locations()->attach($location);
+
+ $this->assertCount(1, $mealtime->locations);
+ $this->assertSame($location->getKey(), $mealtime->locations->first()->getKey());
+});
diff --git a/tests/Admin/Models/TableTest.php b/tests/Admin/Models/TableTest.php
new file mode 100644
index 000000000..e5e514bd8
--- /dev/null
+++ b/tests/Admin/Models/TableTest.php
@@ -0,0 +1,79 @@
+delete();
+});
+
+it('should fail to create a table when no name is provided', function () {
+ try {
+ $table = Table::factory()->make();
+ $table->table_name = null;
+ $table->save();
+ $this->assertFalse(true);
+ }
+ catch (\Exception $e) {
+ $this->assertFalse(false);
+ }
+});
+
+it('should be able to create and delete a table', function () {
+ $table = Table::factory()->make();
+ $table->save();
+
+ $table->delete();
+
+ $this->assertNull($table->fresh());
+});
+
+it('should filter tables by status', function () {
+ $table1 = Table::factory()->make();
+ $table1->table_status = true;
+ $table1->save();
+
+ $table2 = Table::factory()->make();
+ $table2->table_status = false;
+ $table2->save();
+
+ $tables = Table::query()->isEnabled()->get();
+
+ $this->assertCount(1, $tables);
+});
+
+it('should be able to return tables within a capacity range', function () {
+ $table1 = Table::factory()->make();
+ $table1->min_capacity = 4;
+ $table1->max_capacity = 6;
+ $table1->save();
+
+ $table2 = Table::factory()->make();
+ $table2->min_capacity = 2;
+ $table2->max_capacity = 2;
+ $table2->save();
+
+ $table3 = Table::factory()->make();
+ $table3->min_capacity = 3;
+ $table3->max_capacity = 5;
+ $table3->save();
+
+ $tables = Table::query()->whereBetweenCapacity(4, 5)->get();
+
+ $this->assertCount(2, $tables);
+});
+
+it('should be able to attach a table to a location', function () {
+ $location = Location::factory()->make();
+ $location->save();
+
+ $table = Table::factory()->make();
+ $table->save();
+
+ $table->locations()->attach($location);
+
+ $this->assertCount(1, $table->locations);
+ $this->assertSame($location->getKey(), $table->locations->first()->getKey());
+});
diff --git a/tests/Admin/Requests/LocationTest.php b/tests/Admin/Requests/LocationTest.php
index 5eb925e89..77426571f 100644
--- a/tests/Admin/Requests/LocationTest.php
+++ b/tests/Admin/Requests/LocationTest.php
@@ -5,43 +5,34 @@
use Igniter\Admin\Requests\Location;
it('has required rule for location_name, location_email and ...', function () {
- expect('required')->toBeIn(array_get((new Location)->rules(), 'location_name'));
+ $rules = (new Location)->rules();
- expect('required')->toBeIn(array_get((new Location)->rules(), 'location_email'));
-
- expect('required')->toBeIn(array_get((new Location)->rules(), 'location_address_1'));
-
- expect('required')->toBeIn(array_get((new Location)->rules(), 'location_country_id'));
-
- expect('required')->toBeIn(array_get((new Location)->rules(), 'options.auto_lat_lng'));
+ expect('required')->toBeIn(array_get($rules, 'location_name'));
+ expect('required')->toBeIn(array_get($rules, 'location_email'));
+ expect('required')->toBeIn(array_get($rules, 'location_address_1'));
+ expect('required')->toBeIn(array_get($rules, 'location_country_id'));
+ expect('required')->toBeIn(array_get($rules, 'options.auto_lat_lng'));
});
it('has sometimes rule for inputs', function () {
- expect('sometimes')->toBeIn(array_get((new Location)->rules(), 'location_telephone'));
-
- expect('sometimes')->toBeIn(array_get((new Location)->rules(), 'location_lat'));
+ $rules = (new Location)->rules();
- expect('sometimes')->toBeIn(array_get((new Location)->rules(), 'location_lng'));
+ expect('sometimes')->toBeIn(array_get($rules, 'location_telephone'));
+ expect('sometimes')->toBeIn(array_get($rules, 'location_lat'));
+ expect('sometimes')->toBeIn(array_get($rules, 'location_lng'));
});
it('has max characters rule for inputs', function () {
- expect('max:96')->toBeIn(array_get((new Location)->rules(), 'location_email'));
-
- expect('between:2,128')->toBeIn(array_get((new Location)->rules(), 'location_address_1'));
-
- expect('max:128')->toBeIn(array_get((new Location)->rules(), 'location_address_2'));
-
- expect('max:128')->toBeIn(array_get((new Location)->rules(), 'location_city'));
-
- expect('max:128')->toBeIn(array_get((new Location)->rules(), 'location_state'));
-
- expect('max:15')->toBeIn(array_get((new Location)->rules(), 'location_postcode'));
-
- expect('max:3028')->toBeIn(array_get((new Location)->rules(), 'description'));
-
- expect('max:255')->toBeIn(array_get((new Location)->rules(), 'permalink_slug'));
-
- expect('max:128')->toBeIn(array_get((new Location)->rules(), 'gallery.title'));
-
- expect('max:255')->toBeIn(array_get((new Location)->rules(), 'gallery.description'));
+ $rules = (new Location)->rules();
+
+ expect('max:96')->toBeIn(array_get($rules, 'location_email'));
+ expect('between:2,128')->toBeIn(array_get($rules, 'location_address_1'));
+ expect('max:128')->toBeIn(array_get($rules, 'location_address_2'));
+ expect('max:128')->toBeIn(array_get($rules, 'location_city'));
+ expect('max:128')->toBeIn(array_get($rules, 'location_state'));
+ expect('max:15')->toBeIn(array_get($rules, 'location_postcode'));
+ expect('max:3028')->toBeIn(array_get($rules, 'description'));
+ expect('max:255')->toBeIn(array_get($rules, 'permalink_slug'));
+ expect('max:128')->toBeIn(array_get($rules, 'options.gallery.title'));
+ expect('max:255')->toBeIn(array_get($rules, 'options.gallery.description'));
});
diff --git a/tests/Admin/Requests/MealtimeTest.php b/tests/Admin/Requests/MealtimeTest.php
index 617656140..2bf550703 100644
--- a/tests/Admin/Requests/MealtimeTest.php
+++ b/tests/Admin/Requests/MealtimeTest.php
@@ -5,25 +5,29 @@
use Igniter\Admin\Requests\Mealtime;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new Mealtime)->rules(), 'mealtime_name'));
+ $rules = (new Mealtime)->rules();
- expect('required')->toBeIn(array_get((new Mealtime)->rules(), 'start_time'));
-
- expect('required')->toBeIn(array_get((new Mealtime)->rules(), 'end_time'));
-
- expect('required')->toBeIn(array_get((new Mealtime)->rules(), 'mealtime_status'));
+ expect('required')->toBeIn(array_get($rules, 'mealtime_name'));
+ expect('required')->toBeIn(array_get($rules, 'start_time'));
+ expect('required')->toBeIn(array_get($rules, 'end_time'));
+ expect('required')->toBeIn(array_get($rules, 'mealtime_status'));
});
it('has max characters rule for mealtime_name input', function () {
- expect('between:2,128')->toBeIn(array_get((new Mealtime)->rules(), 'mealtime_name'));
+ $rules = (new Mealtime)->rules();
+
+ expect('between:2,128')->toBeIn(array_get($rules, 'mealtime_name'));
});
it('has unique rule for mealtime_name input', function () {
- expect('unique:mealtimes')->toBeIn(array_get((new Mealtime)->rules(), 'mealtime_name'));
+ $rules = (new Mealtime)->rules();
+
+ expect('unique:mealtimes')->toBeIn(array_get($rules, 'mealtime_name'));
});
it('has valid_time rule for start_time and end_time input', function () {
- expect('valid_time')->toBeIn(array_get((new Mealtime)->rules(), 'start_time'));
+ $rules = (new Mealtime)->rules();
- expect('valid_time')->toBeIn(array_get((new Mealtime)->rules(), 'end_time'));
+ expect('valid_time')->toBeIn(array_get($rules, 'start_time'));
+ expect('valid_time')->toBeIn(array_get($rules, 'end_time'));
});
diff --git a/tests/Admin/Requests/MenuTest.php b/tests/Admin/Requests/MenuTest.php
index a3d791585..91faadf48 100644
--- a/tests/Admin/Requests/MenuTest.php
+++ b/tests/Admin/Requests/MenuTest.php
@@ -5,16 +5,22 @@
use Igniter\Admin\Requests\Menu;
it('has rules for menu_name', function () {
- expect('required')->toBeIn(array_get((new Menu)->rules(), 'menu_name'));
- expect('between:2,255')->toBeIn(array_get((new Menu)->rules(), 'menu_name'));
- expect('unique:menus')->toBeIn(array_get((new Menu)->rules(), 'menu_name'));
+ $rules = (new Menu)->rules();
+
+ expect('required')->toBeIn(array_get($rules, 'menu_name'));
+ expect('between:2,255')->toBeIn(array_get($rules, 'menu_name'));
+ expect('unique:menus')->toBeIn(array_get($rules, 'menu_name'));
});
it('has rules for menu_price', function () {
- expect('required')->toBeIn(array_get((new Menu)->rules(), 'menu_price'));
- expect('min:0')->toBeIn(array_get((new Menu)->rules(), 'menu_price'));
+ $rules = (new Menu)->rules();
+
+ expect('required')->toBeIn(array_get($rules, 'menu_price'));
+ expect('min:0')->toBeIn(array_get($rules, 'menu_price'));
});
it('has rules for menu_description', function () {
- expect('between:2,1028')->toBeIn(array_get((new Menu)->rules(), 'menu_description'));
+ $rules = (new Menu)->rules();
+
+ expect('between:2,1028')->toBeIn(array_get($rules, 'menu_description'));
});
diff --git a/tests/Admin/Requests/ReservationTest.php b/tests/Admin/Requests/ReservationTest.php
index e6c9f0b68..ad777f692 100644
--- a/tests/Admin/Requests/ReservationTest.php
+++ b/tests/Admin/Requests/ReservationTest.php
@@ -5,29 +5,27 @@
use Igniter\Admin\Requests\Reservation;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'location_id'));
-
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'first_name'));
-
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'last_name'));
-
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'reserve_date'));
-
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'reserve_time'));
-
- expect('required')->toBeIn(array_get((new Reservation)->rules(), 'guest_num'));
+ $rules = (new Reservation)->rules();
+
+ expect('required')->toBeIn(array_get($rules, 'location_id'));
+ expect('required')->toBeIn(array_get($rules, 'first_name'));
+ expect('required')->toBeIn(array_get($rules, 'last_name'));
+ expect('required')->toBeIn(array_get($rules, 'reserve_date'));
+ expect('required')->toBeIn(array_get($rules, 'reserve_time'));
+ expect('required')->toBeIn(array_get($rules, 'guest_num'));
});
it('has max characters rule for inputs', function () {
- expect('between:1,48')->toBeIn(array_get((new Reservation)->rules(), 'first_name'));
-
- expect('between:1,48')->toBeIn(array_get((new Reservation)->rules(), 'last_name'));
+ $rules = (new Reservation)->rules();
- expect('max:96')->toBeIn(array_get((new Reservation)->rules(), 'email'));
+ expect('between:1,48')->toBeIn(array_get($rules, 'first_name'));
+ expect('between:1,48')->toBeIn(array_get($rules, 'last_name'));
+ expect('max:96')->toBeIn(array_get($rules, 'email'));
});
it('has valid_date and valid_time rule for inputs', function () {
- expect('valid_date')->toBeIn(array_get((new Reservation)->rules(), 'reserve_date'));
+ $rules = (new Reservation)->rules();
- expect('valid_time')->toBeIn(array_get((new Reservation)->rules(), 'reserve_time'));
+ expect('valid_date')->toBeIn(array_get($rules, 'reserve_date'));
+ expect('valid_time')->toBeIn(array_get($rules, 'reserve_time'));
});
diff --git a/tests/Admin/Requests/StatusTest.php b/tests/Admin/Requests/StatusTest.php
index c5d062f71..cbcd2092a 100644
--- a/tests/Admin/Requests/StatusTest.php
+++ b/tests/Admin/Requests/StatusTest.php
@@ -5,21 +5,23 @@
use Igniter\Admin\Requests\Status;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new Status)->rules(), 'status_name'));
+ $rules = (new Status)->rules();
- expect('required')->toBeIn(array_get((new Status)->rules(), 'status_for'));
-
- expect('required')->toBeIn(array_get((new Status)->rules(), 'notify_customer'));
+ expect('required')->toBeIn(array_get($rules, 'status_name'));
+ expect('required')->toBeIn(array_get($rules, 'status_for'));
+ expect('required')->toBeIn(array_get($rules, 'notify_customer'));
});
it('has max characters rule for inputs', function () {
- expect('between:2,32')->toBeIn(array_get((new Status)->rules(), 'status_name'));
-
- expect('max:7')->toBeIn(array_get((new Status)->rules(), 'status_color'));
+ $rules = (new Status)->rules();
- expect('max:1028')->toBeIn(array_get((new Status)->rules(), 'status_comment'));
+ expect('between:2,32')->toBeIn(array_get($rules, 'status_name'));
+ expect('max:7')->toBeIn(array_get($rules, 'status_color'));
+ expect('max:1028')->toBeIn(array_get($rules, 'status_comment'));
});
it('has in:order,reservation rule for inputs', function () {
- expect('in:order,reservation')->toBeIn(array_get((new Status)->rules(), 'status_for'));
+ $rules = (new Status)->rules();
+
+ expect('in:order,reservation')->toBeIn(array_get($rules, 'status_for'));
});
diff --git a/tests/Admin/Requests/TableTest.php b/tests/Admin/Requests/TableTest.php
index 9ce2fbe10..488fbc83a 100644
--- a/tests/Admin/Requests/TableTest.php
+++ b/tests/Admin/Requests/TableTest.php
@@ -5,34 +5,42 @@
use Igniter\Admin\Requests\Table;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new Table)->rules(), 'table_name'));
+ $rules = (new Table)->rules();
- expect('required')->toBeIn(array_get((new Table)->rules(), 'min_capacity'));
+ expect('required')->toBeIn(array_get($rules, 'table_name'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'max_capacity'));
+ expect('required')->toBeIn(array_get($rules, 'min_capacity'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'extra_capacity'));
+ expect('required')->toBeIn(array_get($rules, 'max_capacity'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'priority'));
+ expect('required')->toBeIn(array_get($rules, 'extra_capacity'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'is_joinable'));
+ expect('required')->toBeIn(array_get($rules, 'priority'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'table_status'));
+ expect('required')->toBeIn(array_get($rules, 'is_joinable'));
- expect('required')->toBeIn(array_get((new Table)->rules(), 'locations'));
+ expect('required')->toBeIn(array_get($rules, 'table_status'));
+
+ expect('required')->toBeIn(array_get($rules, 'locations'));
});
it('has rules for table_name input', function () {
- expect('between:2,255')->toBeIn(array_get((new Table)->rules(), 'table_name'));
- expect('unique:tables')->toBeIn(array_get((new Table)->rules(), 'table_name'));
+ $rules = (new Table)->rules();
+
+ expect('between:2,255')->toBeIn(array_get($rules, 'table_name'));
+ expect('unique:tables')->toBeIn(array_get($rules, 'table_name'));
});
it('has min character rule for min_capacity and max_capacity input', function () {
- expect('min:1')->toBeIn(array_get((new Table)->rules(), 'min_capacity'));
- expect('min:1')->toBeIn(array_get((new Table)->rules(), 'max_capacity'));
+ $rules = (new Table)->rules();
+
+ expect('min:1')->toBeIn(array_get($rules, 'min_capacity'));
+ expect('min:1')->toBeIn(array_get($rules, 'max_capacity'));
});
it('has rules for max_capacity input', function () {
- expect('lte:max_capacity')->toBeIn(array_get((new Table)->rules(), 'min_capacity'));
- expect('gte:min_capacity')->toBeIn(array_get((new Table)->rules(), 'max_capacity'));
+ $rules = (new Table)->rules();
+
+ expect('lte:max_capacity')->toBeIn(array_get($rules, 'min_capacity'));
+ expect('gte:min_capacity')->toBeIn(array_get($rules, 'max_capacity'));
});
diff --git a/tests/Admin/Requests/UserGroupTest.php b/tests/Admin/Requests/UserGroupTest.php
index 44f56e0eb..eb92dc980 100644
--- a/tests/Admin/Requests/UserGroupTest.php
+++ b/tests/Admin/Requests/UserGroupTest.php
@@ -5,19 +5,19 @@
use Igniter\Admin\Requests\UserGroup;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new UserGroup)->rules(), 'user_group_name'));
+ $rules = (new UserGroup)->rules();
- expect('required')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign'));
-
- expect('required_if:auto_assign,true')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign_mode'));
-
- expect('required_if:auto_assign_mode,2')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign_limit'));
-
- expect('required_if:auto_assign,true')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign_availability'));
+ expect('required')->toBeIn(array_get($rules, 'user_group_name'));
+ expect('required')->toBeIn(array_get($rules, 'auto_assign'));
+ expect('required_if:auto_assign,true')->toBeIn(array_get($rules, 'auto_assign_mode'));
+ expect('required_if:auto_assign_mode,2')->toBeIn(array_get($rules, 'auto_assign_limit'));
+ expect('required_if:auto_assign,true')->toBeIn(array_get($rules, 'auto_assign_availability'));
});
it('has max characters rule for inputs', function () {
- expect('between:2,128')->toBeIn(array_get((new UserGroup)->rules(), 'user_group_name'));
- expect('max:2')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign_mode'));
- expect('max:99')->toBeIn(array_get((new UserGroup)->rules(), 'auto_assign_limit'));
+ $rules = (new UserGroup)->rules();
+
+ expect('between:2,128')->toBeIn(array_get($rules, 'user_group_name'));
+ expect('max:2')->toBeIn(array_get($rules, 'auto_assign_mode'));
+ expect('max:99')->toBeIn(array_get($rules, 'auto_assign_limit'));
});
diff --git a/tests/Admin/Requests/UserRoleTest.php b/tests/Admin/Requests/UserRoleTest.php
index 9fe7b570c..8e71e0fcf 100644
--- a/tests/Admin/Requests/UserRoleTest.php
+++ b/tests/Admin/Requests/UserRoleTest.php
@@ -5,23 +5,28 @@
use Igniter\Admin\Requests\UserRole;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new UserRole)->rules(), 'name'));
+ $rules = (new UserRole)->rules();
- expect('required')->toBeIn(array_get((new UserRole)->rules(), 'permissions'));
-
- expect('required')->toBeIn(array_get((new UserRole)->rules(), 'permissions.*'));
+ expect('required')->toBeIn(array_get($rules, 'name'));
+ expect('required')->toBeIn(array_get($rules, 'permissions'));
+ expect('required')->toBeIn(array_get($rules, 'permissions.*'));
});
it('has max characters rule for inputs', function () {
- expect('between:2,32')->toBeIn(array_get((new UserRole)->rules(), 'code'));
+ $rules = (new UserRole)->rules();
- expect('between:2,128')->toBeIn(array_get((new UserRole)->rules(), 'name'));
+ expect('between:2,32')->toBeIn(array_get($rules, 'code'));
+ expect('between:2,128')->toBeIn(array_get($rules, 'name'));
});
it('has alpha_dash rule for inputs', function () {
- expect('alpha_dash')->toBeIn(array_get((new UserRole)->rules(), 'code'));
+ $rules = (new UserRole)->rules();
+
+ expect('alpha_dash')->toBeIn(array_get($rules, 'code'));
});
it('has unique:admin_user_roles rule for inputs', function () {
- expect('unique:admin_user_roles')->toBeIn(array_get((new UserRole)->rules(), 'name'));
+ $rules = (new UserRole)->rules();
+
+ expect('unique:admin_user_roles')->toBeIn(array_get($rules, 'name'));
});
diff --git a/tests/Admin/Requests/UserTest.php b/tests/Admin/Requests/UserTest.php
index 80a7c91c0..1eac7ab80 100644
--- a/tests/Admin/Requests/UserTest.php
+++ b/tests/Admin/Requests/UserTest.php
@@ -5,41 +5,37 @@
use Igniter\Admin\Requests\User;
it('has required rule for inputs', function () {
- expect('required')->toBeIn(array_get((new User)->rules(), 'name'));
-
- expect('required')->toBeIn(array_get((new User)->rules(), 'email'));
-
- expect('required')->toBeIn(array_get((new User)->rules(), 'username'));
-
- expect('required_if:send_invite,0')->toBeIn(array_get((new User)->rules(), 'password'));
-
- expect('required')->toBeIn(array_get((new User)->rules(), 'user_role_id'));
-
- expect('required')->toBeIn(array_get((new User)->rules(), 'groups'));
+ $rules = (new User)->rules();
+
+ expect('required')->toBeIn(array_get($rules, 'name'));
+ expect('required')->toBeIn(array_get($rules, 'email'));
+ expect('required')->toBeIn(array_get($rules, 'username'));
+ expect('required_if:send_invite,0')->toBeIn(array_get($rules, 'password'));
+ expect('required')->toBeIn(array_get($rules, 'user_role_id'));
+ expect('required')->toBeIn(array_get($rules, 'groups'));
});
it('has sometimes rule for inputs', function () {
- expect('sometimes')->toBeIn(array_get((new User)->rules(), 'password'));
+ $rules = (new User)->rules();
- expect('sometimes')->toBeIn(array_get((new User)->rules(), 'user_role_id'));
-
- expect('sometimes')->toBeIn(array_get((new User)->rules(), 'groups'));
+ expect('sometimes')->toBeIn(array_get($rules, 'password'));
+ expect('sometimes')->toBeIn(array_get($rules, 'user_role_id'));
+ expect('sometimes')->toBeIn(array_get($rules, 'groups'));
});
it('has max characters rule for inputs', function () {
- expect('between:2,128')->toBeIn(array_get((new User)->rules(), 'name'));
-
- expect('max:96')->toBeIn(array_get((new User)->rules(), 'email'));
-
- expect('email:filter')->toBeIn(array_get((new User)->rules(), 'email'));
-
- expect('between:2,32')->toBeIn(array_get((new User)->rules(), 'username'));
+ $rules = (new User)->rules();
- expect('between:6,32')->toBeIn(array_get((new User)->rules(), 'password'));
+ expect('between:2,128')->toBeIn(array_get($rules, 'name'));
+ expect('max:96')->toBeIn(array_get($rules, 'email'));
+ expect('email:filter')->toBeIn(array_get($rules, 'email'));
+ expect('between:2,32')->toBeIn(array_get($rules, 'username'));
+ expect('between:6,32')->toBeIn(array_get($rules, 'password'));
});
it('has unique rule for inputs', function () {
- expect('unique:admin_users,email')->toBeIn(array_get((new User)->rules(), 'email'));
+ $rules = (new User)->rules();
- expect('unique:admin_users,username')->toBeIn(array_get((new User)->rules(), 'username'));
+ expect('unique:admin_users,email')->toBeIn(array_get($rules, 'email'));
+ expect('unique:admin_users,username')->toBeIn(array_get($rules, 'username'));
});
diff --git a/tests/Main/Template/PageTest.php b/tests/Main/Template/PageTest.php
index 72a8bc4e4..d36a92b39 100644
--- a/tests/Main/Template/PageTest.php
+++ b/tests/Main/Template/PageTest.php
@@ -8,5 +8,5 @@
it('reads page settings from pages.yml', function () {
$page = Page::load(resolve(ThemeManager::class)->getActiveTheme(), 'nested-page');
- expect($page->settings['title'])->toBe('Nested page');
+ expect($page->title)->toBe('Nested page');
});
diff --git a/tests/TestCase.php b/tests/TestCase.php
index 8ac847372..0ff11e88b 100644
--- a/tests/TestCase.php
+++ b/tests/TestCase.php
@@ -4,6 +4,8 @@
use Igniter\Flame\Igniter;
use Igniter\Main\Classes\ThemeManager;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
abstract class TestCase extends \Orchestra\Testbench\TestCase
{
@@ -30,6 +32,8 @@ protected function defineEnvironment($app)
ThemeManager::addDirectory(__DIR__.'/_fixtures/themes');
$app['config']->set('igniter.system.defaultTheme', 'tests-theme');
+
+ Schema::defaultStringLength(191);
}
protected function defineDatabaseMigrations()
@@ -37,6 +41,14 @@ protected function defineDatabaseMigrations()
$this->artisan('igniter:up')->run();
}
+ protected function defineDatabaseSeeders()
+ {
+ $this->truncate();
+ $this->artisan('db:seed', [
+ '--class' => '\Igniter\System\Database\Seeds\DatabaseSeeder'
+ ])->run();
+ }
+
protected function resolveApplicationConfiguration($app)
{
parent::resolveApplicationConfiguration($app);
@@ -49,4 +61,18 @@ protected function resolveApplicationConfiguration($app)
$app['config']->set("igniter.$config", require(__DIR__."/../config/{$config}.php"));
}
}
+
+ private function truncate()
+ {
+ Schema::disableForeignKeyConstraints();
+ $tableNames = Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();
+ foreach ($tableNames as $name) {
+ //if you don't want to truncate migrations
+ if ($name == 'migrations') {
+ continue;
+ }
+ DB::table($name)->truncate();
+ }
+ Schema::enableForeignKeyConstraints();
+ }
}