Skip to content

Commit afce516

Browse files
committed
Update to Version 1.1.0
1 parent bb27552 commit afce516

73 files changed

Lines changed: 1066 additions & 630 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ master, main, development ]
6+
pull_request:
7+
branches: [ master, main, development ]
8+
9+
jobs:
10+
test:
11+
name: PHP Tests
12+
runs-on: ubuntu-latest
13+
14+
services:
15+
mysql:
16+
image: mysql:8.0
17+
env:
18+
MYSQL_ROOT_PASSWORD: root
19+
MYSQL_DATABASE: test_db
20+
ports:
21+
- 3306:3306
22+
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
23+
24+
steps:
25+
- name: Checkout code
26+
uses: actions/checkout@v4
27+
28+
- name: Setup PHP
29+
uses: shivammathur/setup-php@v2
30+
with:
31+
php-version: '8.1'
32+
extensions: mbstring, xml, curl, mysql, pdo, pdo_mysql, gd, zip
33+
coverage: xdebug
34+
35+
- name: Cache Composer dependencies
36+
uses: actions/cache@v3
37+
with:
38+
path: ~/.composer/cache
39+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
40+
restore-keys: |
41+
${{ runner.os }}-composer-
42+
43+
- name: Install Composer dependencies
44+
run: composer install --prefer-dist --no-progress --no-interaction
45+
46+
- name: Setup environment
47+
run: |
48+
cp .env.sample .env
49+
echo "DB_DRIVER=mysql" >> .env
50+
echo "DB_HOST=127.0.0.1" >> .env
51+
echo "DB_NAME=test_db" >> .env
52+
echo "DB_USER=root" >> .env
53+
echo "DB_PASS=root" >> .env
54+
echo "SECRET_KEY=test_secret_key_for_ci_$(openssl rand -hex 32)" >> .env
55+
echo "DEBUG=true" >> .env
56+
echo "FRONTEND_URL=http://localhost:3000" >> .env
57+
echo "DEFAULT_BLOCK_LANG=1" >> .env
58+
echo "SLIDERFILESPATH=upload/sliderImg/" >> .env
59+
60+
- name: Wait for MySQL
61+
run: |
62+
for i in {1..30}; do
63+
if mysqladmin ping -h 127.0.0.1 -u root -proot --silent; then
64+
echo "MySQL is ready!"
65+
break
66+
fi
67+
echo "Waiting for MySQL... ($i/30)"
68+
sleep 2
69+
done
70+
71+
- name: Create test database schema (if needed)
72+
run: |
73+
# Test database should be created automatically by MySQL service
74+
# But we can verify it exists
75+
mysql -h 127.0.0.1 -u root -proot -e "SHOW DATABASES;" || echo "MySQL connection check"
76+
continue-on-error: true
77+
78+
- name: Run PHPUnit tests
79+
run: vendor/bin/phpunit --testdox --colors=always
80+
env:
81+
DB_HOST: 127.0.0.1
82+
DB_NAME: test_db
83+
DB_USER: root
84+
DB_PASS: root
85+
86+
- name: Upload test results
87+
if: always()
88+
uses: actions/upload-artifact@v3
89+
with:
90+
name: test-results
91+
path: |
92+
.phpunit.result.cache
93+
tests/_output/*
94+
95+
phpstan:
96+
name: PHPStan Analysis
97+
runs-on: ubuntu-latest
98+
99+
steps:
100+
- name: Checkout code
101+
uses: actions/checkout@v4
102+
103+
- name: Setup PHP
104+
uses: shivammathur/setup-php@v2
105+
with:
106+
php-version: '8.1'
107+
extensions: mbstring, xml, curl, mysql, pdo, pdo_mysql
108+
109+
- name: Cache Composer dependencies
110+
uses: actions/cache@v3
111+
with:
112+
path: ~/.composer/cache
113+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
114+
restore-keys: |
115+
${{ runner.os }}-composer-
116+
117+
- name: Install Composer dependencies
118+
run: composer install --prefer-dist --no-progress --no-interaction
119+
120+
- name: Run PHPStan
121+
run: vendor/bin/phpstan analyse --memory-limit=1G
122+
continue-on-error: true
123+
124+
codesniffer:
125+
name: PHP CodeSniffer
126+
runs-on: ubuntu-latest
127+
128+
steps:
129+
- name: Checkout code
130+
uses: actions/checkout@v4
131+
132+
- name: Setup PHP
133+
uses: shivammathur/setup-php@v2
134+
with:
135+
php-version: '8.1'
136+
extensions: mbstring, xml
137+
138+
- name: Cache Composer dependencies
139+
uses: actions/cache@v3
140+
with:
141+
path: ~/.composer/cache
142+
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
143+
restore-keys: |
144+
${{ runner.os }}-composer-
145+
146+
- name: Install Composer dependencies
147+
run: composer install --prefer-dist --no-progress --no-interaction
148+
149+
- name: Run PHP CodeSniffer
150+
run: vendor/bin/phpcs --standard=PSR12 app/ core/ --ignore=app/Views
151+
continue-on-error: true
152+
153+
build-frontend:
154+
name: Build Frontend Assets
155+
runs-on: ubuntu-latest
156+
157+
steps:
158+
- name: Checkout code
159+
uses: actions/checkout@v4
160+
161+
- name: Setup Node.js
162+
uses: actions/setup-node@v4
163+
with:
164+
node-version: '18'
165+
cache: 'npm'
166+
167+
- name: Install npm dependencies
168+
run: npm ci
169+
170+
- name: Build assets
171+
run: npm run build
172+
continue-on-error: true
173+
174+
- name: Check build output
175+
run: |
176+
if [ -d "public/css" ] && [ -d "public/js" ]; then
177+
echo "Build successful - CSS and JS directories exist"
178+
ls -la public/css/
179+
ls -la public/js/
180+
else
181+
echo "Build may have failed - checking for errors"
182+
exit 1
183+
fi

.phpunit.result.cache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"version":2,"defects":{"Tests\\Unit\\Controllers\\SliderControllerTest::testIndexReturnsConfigData":5,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddValidDataReturnsSuccess":8,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddInvalidDataReturnsErrors":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testUpdateCallsServiceWithCorrectData":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testRemoveCallsServiceWithCorrectId":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testSaveConfigCallsServiceWithCorrectData":2,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileValidFile":7,"Tests\\Unit\\Services\\SliderServiceTest::testGetSliderByIdReturnsSlider":8,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderSuccess":8,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderValidationError":8,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderSuccess":8,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderNotFound":8,"Tests\\Unit\\Services\\SliderServiceTest::testUpdateSliderInlineSuccess":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testGetBlockByIdReturnsBlock":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockSuccess":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataValid":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataInvalid":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testDeleteBlockInvalidId":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testUpdateBlockInlineInvalidId":8,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithLongText":7,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithEmptyText":7,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithCustomEnd":7},"times":{"Tests\\Unit\\Controllers\\SliderControllerTest::testIndexReturnsConfigData":0.004,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddValidDataReturnsSuccess":0.006,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddInvalidDataReturnsErrors":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testUpdateCallsServiceWithCorrectData":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testRemoveCallsServiceWithCorrectId":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testSaveConfigCallsServiceWithCorrectData":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileValidImage":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileInvalidType":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileTooLarge":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileUploadError":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileNoTmpName":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileValidFile":0.001,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileInvalidFile":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testGetBlockByIdReturnsBlock":0.003,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockSuccess":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockValidationError":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataValid":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataInvalid":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testDeleteBlockInvalidId":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testUpdateBlockInlineInvalidId":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testDayOfWeekReturnsCorrectGreeting":0.001,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithLongText":0.002,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithShortText":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithEmptyText":0.001,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithCustomEnd":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWordBoundaries":0}}
1+
{"version":2,"defects":{"Tests\\Unit\\Controllers\\SliderControllerTest::testIndexReturnsConfigData":5,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddValidDataReturnsSuccess":1,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddInvalidDataReturnsErrors":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testUpdateCallsServiceWithCorrectData":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testRemoveCallsServiceWithCorrectId":2,"Tests\\Unit\\Controllers\\SliderControllerTest::testSaveConfigCallsServiceWithCorrectData":2,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileValidFile":7,"Tests\\Unit\\Services\\SliderServiceTest::testGetSliderByIdReturnsSlider":1,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderSuccess":8,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderValidationError":8,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderSuccess":8,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderNotFound":8,"Tests\\Unit\\Services\\SliderServiceTest::testUpdateSliderInlineSuccess":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testGetBlockByIdReturnsBlock":1,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockSuccess":1,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataValid":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataInvalid":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testDeleteBlockInvalidId":8,"Tests\\Unit\\Services\\StaticBlockServiceTest::testUpdateBlockInlineInvalidId":8,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithLongText":7,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithEmptyText":7,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithCustomEnd":7,"Tests\\Unit\\Controllers\\AuthControllerTest::testGetPasswdHashReturnsFalseWhenServicePasswordNotFound":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLogoutClearsCookieAndSession":7,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithEmptyEmailShowsWarning":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithEmptyPasswordShowsWarning":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithInvalidEmailShowsError":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithInvalidPasswordShowsError":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithValidCredentialsSetsSessionAndCookie":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithServicePasswordWorks":1,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginHandlesJWTEncodingException":1},"times":{"Tests\\Unit\\Controllers\\SliderControllerTest::testIndexReturnsConfigData":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddValidDataReturnsSuccess":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testAddInvalidDataReturnsErrors":0.004,"Tests\\Unit\\Controllers\\SliderControllerTest::testUpdateCallsServiceWithCorrectData":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testRemoveCallsServiceWithCorrectId":0,"Tests\\Unit\\Controllers\\SliderControllerTest::testSaveConfigCallsServiceWithCorrectData":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileValidImage":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileInvalidType":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileTooLarge":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileUploadError":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testValidateFileNoTmpName":0,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileValidFile":0.002,"Tests\\Unit\\Services\\FileUploadServiceTest::testUploadFileInvalidFile":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testGetBlockByIdReturnsBlock":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockSuccess":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testCreateBlockValidationError":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataValid":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testValidateBlockDataInvalid":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testDeleteBlockInvalidId":0,"Tests\\Unit\\Services\\StaticBlockServiceTest::testUpdateBlockInlineInvalidId":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testDayOfWeekReturnsCorrectGreeting":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithLongText":0.001,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithShortText":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithEmptyText":0.001,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWithCustomEnd":0,"Tests\\Unit\\Services\\TextUtilitiesTest::testSubstrwordsWordBoundaries":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testGetPasswdHashReturnsFalseWhenServicePasswordNotFound":0.002,"Tests\\Unit\\Controllers\\AuthControllerTest::testIsLoggedInReturnsFalseWhenNoTokenCookie":0.001,"Tests\\Unit\\Controllers\\AuthControllerTest::testIsLoggedInReturnsFalseWhenTokenIsInvalid":0.001,"Tests\\Unit\\Controllers\\AuthControllerTest::testIsLoggedInReturnsTrueWhenTokenIsValid":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testIsLoggedInReturnsFalseWhenTokenIsExpired":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testIsLoggedInUsesDefaultKeyWhenSecretKeyIsEmpty":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLogoutClearsCookieAndSession":0.006,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithEmptyEmailShowsWarning":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithEmptyPasswordShowsWarning":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithInvalidEmailShowsError":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithInvalidPasswordShowsError":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithValidCredentialsSetsSessionAndCookie":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginWithServicePasswordWorks":0,"Tests\\Unit\\Controllers\\AuthControllerTest::testLoginHandlesJWTEncodingException":0,"Tests\\Unit\\Services\\SliderServiceTest::testGetSliderByIdReturnsSlider":0.022,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderSuccess":0,"Tests\\Unit\\Services\\SliderServiceTest::testCreateSliderValidationError":0.001,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderSuccess":0,"Tests\\Unit\\Services\\SliderServiceTest::testDeleteSliderNotFound":0,"Tests\\Unit\\Services\\SliderServiceTest::testUpdateSliderInlineSuccess":0.012,"Tests\\Unit\\Services\\SliderServiceTest::testUpdateSliderInlineInvalidId":0}}

0 commit comments

Comments
 (0)