Skip to content

Latest commit

 

History

History
103 lines (76 loc) · 3.41 KB

unit-testing.md

File metadata and controls

103 lines (76 loc) · 3.41 KB

Unit Testing

  • KFC includes a feature to make sure that it only updates the cache key for any unique record once per request. It does this by keeping a local cache of what has been processed already.
  • One unit test case is considered to be "one request", which means that within a test case, KFC will only ever update the cache key for a record once - even if you perform multiple changes and writes to that record.
  • A developer might want to create tests that check their cache key updates when they trigger a change on that record.

Below is an example of a reasonable test that a developer might want to undertake. You would expect that the LastEdited and getCacheKey() values update with each var_dump().

class SiteConfigTest extends SapphireTest
{

    protected $usesDatabase = true;

    public function testSiteConfigCacheKey(): void
    {
        $siteConfig = SiteConfig::current_site_config();
        // Output intitial values
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());

        // Sleep for a second to make sure our date changes
        sleep(1);

        // Make a change to SiteConfig
        $siteConfig->Title = 'Updated Site Title 1';
        $siteConfig->write();

        // We would expect these values to change now
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());

        // Sleep for a second to make sure our date changes
        sleep(1);

        // Make a change to SiteConfig
        $siteConfig->Title = 'Updated Site Title 2';
        $siteConfig->write();

        // We would expect these values to change again now
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());
    }

}

Actual: LastEdited does update, but getCacheKey() does not.

In order to get the expected outcome, developers need to add ProcessedUpdatesService::singleton()->flush(); before they write() their record. This clears the local cache of processed records from KFC, and will mean that any new changes to your records will trigger their cache keys to be updated (even if they have done so previously in this request).

EG:

class SiteConfigTest extends SapphireTest
{

    protected $usesDatabase = true;

    public function testSiteConfigCacheKey(): void
    {
        $siteConfig = SiteConfig::current_site_config();
        // Output intitial values
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());

        // Sleep for a second to make sure our date changes
        sleep(1);

        // Flush updates from KFC so that new writes invalidate cache keys
        ProcessedUpdatesService::singleton()->flush();

        // Make a change to SiteConfig
        $siteConfig->Title = 'Updated Site Title 1';
        $siteConfig->write();

        // We would expect these values to change now
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());

        // Sleep for a second to make sure our date changes
        sleep(1);

        // Flush updates from KFC so that new writes invalidate cache keys
        ProcessedUpdatesService::singleton()->flush();

        // Make a change to SiteConfig
        $siteConfig->Title = 'Updated Site Title 2';
        $siteConfig->write();

        // We would expect these values to change again now
        var_dump($siteConfig->LastEdited);
        var_dump($siteConfig->getCacheKey());
    }

}