Вот те подозрение на баги. Если я не прав - не обессудь.
Для разминки - acl.php, после ?> идет пустая строка. А доке ты же сам просил не ставить до или после <? ?> пробелов, по известным причинам

Ну, это так, улыбнуло тока. Чтобы не глючить, не нужно вообще закрыть пхп тег.
1. (?:view|edit|list|create|delete|createFolder|editFolder|moveFolder|deleteFolder|move)
Ошибка в регах.
Выливается ли он в БАГ - не знаю, без запуска не понять. Надо сделать запись в лог конечного отрендеренного рега и код рядом посмотреть, тогда я точно отвечу.
Если ты используешь preg_match и условия или (в скобочках), то обязательно сначала перечисляй самые длинные условия, т.е. сначала "createFolder", а потом более короткий "create". PRCE в данной части крайне ленив. Если исходная команда "createFolder", то найдя в шаблоне "create", PRCE бросит проверять остальные варианты. Т.е. createFolder писать вообще бессмысленно.
Ошибка проявится, если пытаться выделить в переменную \\1 найденный блок. Если идет просто проверка вариантов - ошибки логики не будет.
2. acl.php
Полнейшая чушь работы с кешем. Помнишь, я неделю назад "писал" о другом мега фреймворке? Осветил работу с кешом. Ты меня не слушал. Ну, во-первых, при использовании кеша ты делаешь лишнюю языковую конструкцию "Если кеш есть - один код, если нет - другой" и лишнюю вложенность кода. Это не баг, а просто сложность. Во-вторых, ни намека на мультитеги, чтобы разом можно было кучу кешированных объектов уничтожать. Это - детский сад.
3. В-третьих, самое главное в кеше - его вовремя удалить. Здесь то и баги.
public function get($param = null, $clean = false, $full = false)
public function getForGroup($gid, $full = false)
Две функции проверки наличия кеша, вычисления по SQL таблице sys_access, и его установка.
public function deleteGroup($gid)
public function deleteGroupDefault($gid)
public function deleteDefault()
public function deleteUser($uid)
И куча функций по удалянию/модификации чего-то из той же SQL таблицы sys_access. А кеш не удаляется!
Ну и так далее по коду - часть функций что-то кеширует (из базы), а те функции, которые МОДИФИЦИРУЮТ это "что-то" (базу) и не думали кеш уничтожать.
Это системный баг. По ВСЕМУ КОДУ $cache->delete вообще ни разу не встречается.
Увидел только эту слабую попытку:
// удаляем кэш
$this->cache->set($this->obj_id, null);
Через SET тоже не видно, чтобы хоть где-то принялось, кроме этого места, которое видно тебя достало багами.
4. Тесты к acl.php сделаны через жопу. Там получение информации идет из функций класса, которые только пишут в кеш, т.е. нормально class->get. А вот удаление, почему-то, в тестах идет не через соотв. функции class->delete (и остальные с ними) - а напрямую через SQL! Это бред! Половину класса тестить функциями, половину - через прямой доступ к SQL.
пример теста:
$this->assertEqual(2, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));
$this->acl->deleteUser(1);
$this->assertEqual(0, $this->db->getOne('SELECT COUNT(*) FROM `sys_access` WHERE `uid` = 1'));
Тест категорически не должен использовать SQL, кроме очень-очень редких случаев. Если бы сделал тест грамотно:
class->get (вернули из базы, т.к. кеш пуст)
class->set (записали в кеш)
class->delete (нихрена кеш не удалили)
class->get (вернули что-то из кеша, где устаревшая инфа, хотя в базе все ок)
то сам бы и понял свои баги с кешем. Но ты видимо столкнулся с глюками теста и вместо второго вызова CLASS->GET(), который обломится об кеш, напрямую читаешь с базы. И типа идешь спать спокойно - тест же пройден.
Короче... решение твоих проблем такое:
а) Вынеси ВЕСЬ SQL код в дополнительный класс модели (для каждой таблицы или объекта - своя модель). Может я и излишне опять таки придераюсь, но PHP-контроллер с SQL кодом вперемешку сам по себе уже говнокод.
б) Применяй кеширование только в модели. Класс не должен знать ничего о кешировании. И тесты, разумеется тоже. Но тесты должны всегда пытаться заглючить класс именно на кеше.
в) В каждой функции модели нужно либо:
- проверять кеш, и если его нет - вычислять, сохранять (SELECT методы)
- уничтожать кеш (методы UPDATE, DELETE и т.д.)