init
This commit is contained in:
commit
5adc4f6a10
12 changed files with 8540 additions and 0 deletions
56
.github/workflows/run-tests.yml
vendored
Normal file
56
.github/workflows/run-tests.yml
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
name: Run tests
|
||||
|
||||
on:
|
||||
push:
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
name: "Run ${{ matrix.test-types }} tests"
|
||||
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
test-types:
|
||||
- functional
|
||||
- kernel
|
||||
- unit
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.composer/cache/files
|
||||
key: dependencies-composer-${{ hashFiles('composer.json') }}
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: 7.3
|
||||
extensions: mbstring
|
||||
coverage: none
|
||||
|
||||
- name: Install the Symfony local web server
|
||||
run: |
|
||||
wget https://get.symfony.com/cli/installer -O - | bash
|
||||
mv /home/runner/.symfony/bin/symfony /usr/local/bin/symfony
|
||||
|
||||
- name: Install dependencies
|
||||
run: composer install --prefer-dist --no-interaction --no-suggest
|
||||
|
||||
- name: Start the local web server
|
||||
run: symfony serve -d
|
||||
if: matrix.test-types == 'functional'
|
||||
|
||||
- name: Execute tests
|
||||
run: composer test -- --testsuite=${{ matrix.test-types }}
|
||||
env:
|
||||
SIMPLETEST_BASE_URL: http://localhost:8000
|
||||
|
||||
- name: Stop the local web server
|
||||
run: symfony server:stop
|
||||
if: matrix.test-types == 'functional'
|
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
*
|
||||
!*/
|
||||
!/.github/**
|
||||
!/.gitignore
|
||||
!/**/.gitkeep
|
||||
!/.idea/*.iml
|
||||
!/composer.json
|
||||
!/composer.lock
|
||||
!/docker-compose.yaml
|
||||
!/Makefile
|
||||
!/php.ini
|
||||
!/web/sites/default/settings.php
|
||||
!/web/sites/default/settings.symfony.php
|
||||
/vendor/
|
135
.idea/workshop-drupal-automated-testing-code.iml
generated
Normal file
135
.idea/workshop-drupal-automated-testing-code.iml
generated
Normal file
|
@ -0,0 +1,135 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/asm89/stack-cors" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/behat/mink" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/behat/mink-browserkit-driver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/behat/mink-goutte-driver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/behat/mink-selenium2-driver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/chi-teck/drupal-code-generator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/annotated-command" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/config" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/filter-via-dot-access-data" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/log" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/output-formatters" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/robo" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/self-update" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/site-alias" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/consolidation/site-process" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/container-interop/container-interop" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/dflydev/dot-access-data" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/dnoegel/php-xdg-base-dir" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/annotations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/collections" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/common" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/inflector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/lexer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/drupal/coder" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/drupal/core-composer-scaffold" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/drush/drush" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/easyrdf/easyrdf" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/egulias/email-validator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/fabpot/goutte" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/grasmash/expander" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/grasmash/yaml-expander" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/guzzle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/promises" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/psr7" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/instaclick/php-webdriver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/jakub-onderka/php-console-color" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/jakub-onderka/php-console-highlighter" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/jcalderonzumba/gastonjs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/jcalderonzumba/mink-phantomjs-driver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/justinrainbow/json-schema" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/league/container" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/masterminds/html5" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/mikey179/vfsstream" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/paragonie/random_compat" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/pear/archive_tar" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/pear/console_getopt" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/pear/pear-core-minimal" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/pear/pear_exception" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpspec/prophecy" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-token-stream" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/container" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/http-message" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/psr/log" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/psy/psysh" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/ralouphie/getallheaders" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/resource-operations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/version" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/seld/jsonlint" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/seld/phar-utils" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/squizlabs/php_codesniffer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/stack/builder" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony-cmf/routing" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/browser-kit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/class-loader" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/css-selector" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/debug" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dependency-injection" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/dom-crawler" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/event-dispatcher" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/filesystem" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/finder" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-kernel" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/lock" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/phpunit-bridge" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-ctype" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-iconv" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-mbstring" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php56" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php70" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-php72" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-util" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/process" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/psr-http-message-bridge" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/routing" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/translation" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/validator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/var-dumper" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/yaml" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/theseer/tokenizer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/twig/twig" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/typo3/phar-stream-wrapper" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/webflo/drupal-finder" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/path-util" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/zendframework/zend-diactoros" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/zendframework/zend-escaper" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/zendframework/zend-feed" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/zendframework/zend-stdlib" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
13
README.md
Normal file
13
README.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Drupal Automated Testing Workshop: Example Code
|
||||
|
||||
## Updates
|
||||
|
||||
If we need to update any of the commits, the changes should be rebased into the existing commits so that they continue to be in a linear order as per the workshop document.
|
||||
|
||||
As we want GitHub Actions to run for each commit, we can’t just push the latest commit as that would only trigger a build on the final commit. To do this, we can loop over each of the commit SHAs and push each one separately:
|
||||
|
||||
```bash
|
||||
for sha1 in $(git rev-list HEAD --reverse) ; do
|
||||
git push origin $sha1:master --force
|
||||
done
|
||||
```
|
60
composer.json
Normal file
60
composer.json
Normal file
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
"name": "drupal/recommended-project",
|
||||
"description": "Project template for Drupal 8 projects with a relocated document root",
|
||||
"type": "project",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"homepage": "https://www.drupal.org/project/drupal",
|
||||
"support": {
|
||||
"docs": "https://www.drupal.org/docs/user_guide/en/index.html",
|
||||
"chat": "https://www.drupal.org/node/314178"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "https://packages.drupal.org/8"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"composer/installers": "^1.2",
|
||||
"drupal/admin_toolbar": "^2.0",
|
||||
"drupal/config_installer": "^1.8",
|
||||
"drupal/core-composer-scaffold": "^8.8",
|
||||
"drupal/core-recommended": "^8.8",
|
||||
"drush/drush": "^9"
|
||||
},
|
||||
"require-dev": {
|
||||
"drupal/core-dev": "^8.8"
|
||||
},
|
||||
"conflict": {
|
||||
"drupal/drupal": "*"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"scripts": {
|
||||
"phpunit": "phpunit --verbose --testdox",
|
||||
"test": [
|
||||
"@phpunit"
|
||||
]
|
||||
},
|
||||
"config": {
|
||||
"bin-dir": "bin",
|
||||
"sort-packages": true
|
||||
},
|
||||
"extra": {
|
||||
"drupal-scaffold": {
|
||||
"locations": {
|
||||
"web-root": "web/"
|
||||
}
|
||||
},
|
||||
"installer-paths": {
|
||||
"web/core": ["type:drupal-core"],
|
||||
"web/libraries/{$name}": ["type:drupal-library"],
|
||||
"web/modules/contrib/{$name}": ["type:drupal-module"],
|
||||
"web/profiles/contrib/{$name}": ["type:drupal-profile"],
|
||||
"web/themes/contrib/{$name}": ["type:drupal-theme"],
|
||||
"drush/Commands/contrib/{$name}": ["type:drupal-drush"],
|
||||
"web/modules/custom/{$name}": ["type:drupal-custom-module"],
|
||||
"web/themes/custom/{$name}": ["type:drupal-custom-theme"]
|
||||
}
|
||||
}
|
||||
}
|
8177
composer.lock
generated
Normal file
8177
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
0
config/default/.gitkeep
Normal file
0
config/default/.gitkeep
Normal file
24
docker-compose.yaml
Normal file
24
docker-compose.yaml
Normal file
|
@ -0,0 +1,24 @@
|
|||
version: '2.1'
|
||||
|
||||
services:
|
||||
database:
|
||||
image: mysql:5.7
|
||||
ports: [3306]
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: secret
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql
|
||||
|
||||
database_umami:
|
||||
image: mysql:5.7
|
||||
ports: [3306]
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: secret
|
||||
volumes:
|
||||
- mysql-data-umami:/var/lib/mysql
|
||||
labels:
|
||||
com.symfony.server.service-prefix: 'DATABASE_UMAMI'
|
||||
|
||||
volumes:
|
||||
mysql-data:
|
||||
mysql-data-umami:
|
2
php.ini
Normal file
2
php.ini
Normal file
|
@ -0,0 +1,2 @@
|
|||
[Date]
|
||||
date.timezone = Europe/London
|
31
phpunit.xml.dist
Normal file
31
phpunit.xml.dist
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit bootstrap="./web/core/tests/bootstrap.php" colors="true"
|
||||
beStrictAboutTestsThatDoNotTestAnything="true"
|
||||
beStrictAboutOutputDuringTests="true"
|
||||
beStrictAboutChangesToGlobalState="true"
|
||||
printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter">
|
||||
<php>
|
||||
<ini name="error_reporting" value="32767"/>
|
||||
<ini name="memory_limit" value="-1"/>
|
||||
<env name="SIMPLETEST_BASE_URL" value="https://localhost:8000"/>
|
||||
<env name="SIMPLETEST_DB" value="sqlite://localhost//tmp/test.sqlite"/>
|
||||
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>
|
||||
<env name="BROWSERTEST_OUTPUT_BASE_URL" value=""/>
|
||||
<env name="MINK_DRIVER_CLASS" value=''/>
|
||||
<env name="MINK_DRIVER_ARGS" value=''/>
|
||||
<env name="MINK_DRIVER_ARGS_PHANTOMJS" value=''/>
|
||||
<env name="MINK_DRIVER_ARGS_WEBDRIVER" value=''/>
|
||||
</php>
|
||||
<testsuites>
|
||||
<testsuite name="functional">
|
||||
<directory>./web/modules/custom/**/tests/**/Functional</directory>
|
||||
</testsuite>
|
||||
<testsuite name="kernel">
|
||||
<directory>./web/modules/custom/**/tests/**/Kernel</directory>
|
||||
</testsuite>
|
||||
<testsuite name="unit">
|
||||
<directory>./web/modules/custom/**/tests/**/Unit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
15
web/sites/default/settings.php
Normal file
15
web/sites/default/settings.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
// @codingStandardsIgnoreFile
|
||||
|
||||
$settings['hash_salt'] = '53cr3t!';
|
||||
|
||||
$settings["config_sync_directory"] = '../config/default';
|
||||
|
||||
if ($_SERVER['SYMFONY_DOCKER_ENV'] && file_exists(__DIR__ . '/settings.symfony.php')) {
|
||||
require_once __DIR__ . '/settings.symfony.php';
|
||||
}
|
||||
|
||||
if (file_exists(__DIR__ . '/settings.local.php')) {
|
||||
require_once __DIR__ . '/settings.local.php';
|
||||
}
|
13
web/sites/default/settings.symfony.php
Normal file
13
web/sites/default/settings.symfony.php
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
$databases['default']['default'] = [
|
||||
'driver' => $_SERVER['DATABASE_DRIVER'],
|
||||
'host' => $_SERVER['DATABASE_HOST'],
|
||||
'database' => $_SERVER['DATABASE_NAME'],
|
||||
'username' => $_SERVER['DATABASE_USER'],
|
||||
'password' => $_SERVER['DATABASE_PASSWORD'],
|
||||
'port' => $_SERVER['DATABASE_PORT'],
|
||||
'prefix' => '',
|
||||
'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
|
||||
'collation' => 'utf8mb4_general_ci',
|
||||
];
|
Loading…
Add table
Add a link
Reference in a new issue