diff --git a/includes/class-helpers.php b/includes/class-helpers.php index 3bad465..4ecf607 100644 --- a/includes/class-helpers.php +++ b/includes/class-helpers.php @@ -15,4 +15,14 @@ final class Helpers self::$current_town_resolved = false; self::$term_cache = []; } + + public static function get_term_by_slug(string $slug, string $taxonomy = 'town'): ?\WP_Term + { + $key = $taxonomy . '|' . $slug; + if (array_key_exists($key, self::$term_cache)) { + return self::$term_cache[$key]; + } + $term = \get_term_by('slug', $slug, $taxonomy); + return self::$term_cache[$key] = ($term instanceof \WP_Term) ? $term : null; + } } diff --git a/tests/HelpersTest.php b/tests/HelpersTest.php new file mode 100644 index 0000000..df247c2 --- /dev/null +++ b/tests/HelpersTest.php @@ -0,0 +1,53 @@ +term_id = 42; + $term->slug = 'tyumen'; + $term->taxonomy = 'town'; + + \Brain\Monkey\Functions\expect('get_term_by') + ->once() + ->with('slug', 'tyumen', 'town') + ->andReturn($term); + + $result = Helpers::get_term_by_slug('tyumen'); + + self::assertInstanceOf(\WP_Term::class, $result); + self::assertSame(42, $result->term_id); + self::assertSame('tyumen', $result->slug); + } + + public function test_get_term_by_slug_returns_null_when_not_found(): void + { + \Brain\Monkey\Functions\expect('get_term_by') + ->once() + ->with('slug', 'nonexistent', 'town') + ->andReturn(false); + + self::assertNull(Helpers::get_term_by_slug('nonexistent')); + } + + public function test_get_term_by_slug_caches_results_within_request(): void + { + \Brain\Monkey\Functions\expect('get_term_by') + ->once() + ->with('slug', 'tyumen', 'town') + ->andReturn(false); + + Helpers::get_term_by_slug('tyumen'); + Helpers::get_term_by_slug('tyumen'); + Helpers::get_term_by_slug('tyumen'); + + // Mockery ->once() at teardown verifies the cache stopped repeated calls. + self::assertTrue(true); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 60b78dc..972eec6 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -9,3 +9,7 @@ if (!defined('ABSPATH')) { require_once __DIR__ . '/../includes/class-plugin.php'; \WPMultiCity\Plugin::register_autoloader(); + +if (!class_exists('WP_Term', false)) { + eval('class WP_Term { public int $term_id = 0; public string $slug = ""; public string $taxonomy = ""; }'); +}