Fermer

janvier 11, 2021

Mappages de résolution de ressources JCR de test unitaire


Récemment J'ai eu une tâche à s horten URL et supprimer l'extension HTML dans AEM . En plus de cela J'ai dû ajouter une racine de contexte aux URL pour que ces mappages se produisent.

  • / content / myapp / en_US. html -> /[19659002[/mycontext[19659002) / page d'accueil /
  • / content / myapp /es_ES.html -> / mycontext / es_ES / [19659018] / content / myapp / es_ES /homepage.html -> / mycontext / es_ES / homepage /

Les URL de raccourcissement dans AEM consistent en s de deux choses :

  • Le répartiteur recevra des demandes d'URL courtes sans extension ] Et doit les réécrire avant de les transmettre aux éditeurs.
  • Les liens w Le balisage HTML rendu par AEM doit être réécrit dans leurs versions courtes sans extension.

 Adobe - Contenu pour tous
Contenu pour tous

Les entreprises qui peuvent répondre rapidement et systématiquement aux demandes des consommateurs prospèrent dans un ère de contenu infini. Découvrez comment créer des expériences fluides pour vos clients omnicanal.

Obtenir le guide

La configuration d'Apache est simple. Vous devez inspecter la demande entrante et la traduire dans sa version longue avant de l'envoyer à AEM. Ce que j'ai eu du mal avec était de configurer les mappages Sling pour réécrire URL. Il y a 2 façons d'y parvenir :

  • Mettez à jour le contenu sous / etc / map
  • Ajoutez le mappage à la ressource . propriété de la org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl Configuration OSGi

Ce que je fais

En général, j'ai toujours opté pour la seconde. Je trouve que c'est plus simple à gérer que de gérer le contenu sous / etc / map . La seule chose ennuyeuse est que si vous apportez une modification, tous les composants OSGi qui en dépendent redémarrent. Il est frustrant de devoir attendre longtemps entre les changements. Ceci est particulièrement vrai si j'essaie d'élaborer de nouvelles règles de cartographie.

De nos jours, je me retrouve à faire de plus en plus de TDD. En particulier, j’ai utilisé wcm.io Sling Mocks . Avec JUnit 5 et AssertJ, je peux développer des modèles Sling et des composants OSGi sans jamais avoir à charger une page.

Et c'est tout! J'ai écrit le test unitaire, puis je me suis concentré sur la création d'un ensemble de mappages sortants. Une fois satisfait, je les ai mis dans la configuration OSGi. Ensuite, je suis resté assis pendant 7 minutes jusqu'à ce que le système redevienne réactif et que le travail soit terminé!

 import static org.assertj.core.api.Assertions.assertThat;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import com.google.common.collect.ImmutableMap;
import io.wcm.testing.mock.aem.junit5. *;

@ExtendWith (AemContextExtension.class)
class UrlMappingTest {

    Private static final ImmutableMap  PROPERTIES =
        ImmutableMap.of ("resource.resolver.mapping", ArrayUtils.toArray (
            "/: /",
            "^ / content / myapp / en_US \. html </ mycontext /",
            "^ / content / myapp / fr_US / (. +) \. html </ mycontext / $ 1 /",
            "^ / content / myapp / (. +) \. html </ mycontext / $ 1 /"
        ));

    contexte AemContext final privé =
            nouveau AemContextBuilder (). resourceResolverType (ResourceResolverType.JCR_MOCK)
                                   .resourceResolverFactoryActivatorProps (PROPRIÉTÉS)
                                   .construire();

    @Tester
    public void testShortExtensionlessMappings () {

        ResourceResolver final resourceResolver = this.context.resourceResolver ();

        final String defaultLocaleRoot =
            resourceResolver.map ("/ content / myapp / en_US.html");
        assertThat (defaultLocaleRoot) .isEqualTo ("/ mycontext /");

        final String defaultLocalePath =
            resourceResolver.map ("/ content / myapp / en_US / hello-world.html");
        assertThat (defaultLocalePath) .isEqualTo ("/ mycontext / hello-world /");

        final String localeRoot =
            resourceResolver.map ("/ content / myapp / es_US.html");
        assertThat (localeRoot) .isEqualTo ("/ mycontext / es_US /");

        final String localePath =
            resourceResolver.map ("/ content / myapp / es_US / hello-world.html");
        assertThat (localePath) .isEqualTo ("/ mycontext / es_US / hello-world /");

        chaîne finale qsParams =
            resourceResolver.map ("/ content / myapp / es_US / hello-world.html? foo = bar");
        assertThat (qsParams) .isEqualTo ("/ mycontext / es_US / hello-world /? foo = bar");
    }
}

J'espère que vous avez trouvé ce billet de blog utile. Pour toute question supplémentaire, veuillez commenter ci-dessous et n'oubliez pas de consulter nos autres blogs Adobe .

À propos de l'auteur

Juan Ayala est un développeur principal dans la pratique Adobe chez Perficient, Inc., s'est concentré sur la plate-forme Adobe Experience et les éléments qui l'entourent.

Plus de cet auteur






Source link