Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs
Ronald Barendse 6dc874147f v11: Merge v10/feature/project-cleanup into v11/dev (#13112)
* New backoffice/add system text json configuration attribute (#12998)

* Add SystemTextJsonConfigurationAttribute

* Fix up formatting

* Rename classes for clearer purpose

Co-authored-by: Zeegaan <nge@umbraco.dk>

* UmbracoPath should no longer be configurable (#13032)

* UmbracoPath should no longer be configurable

* Remove UmbracoPath configuration from all tests

* Only contain style instead of full layout (#13033)

* Only contain style instead of full layout (#13033)

* Fix CodeQL duplicate "permissions"  node and reformat

* add an extra check to ensure the pips exist before adding a class to them

* improve pip classList add/remove with no intermediary variable

* Only contain style instead of full layout (#13033)

* Ensure consistent margin on headings in tree root (#12992)

* Ensure consistent margin on headings in tree root (#12992)

(cherry picked from commit 88bfef9e0d)

* Bump version to 10.2.1

* Translate "User permissions for languages" feature to dutch (#12971)

* Translate 'sectionsHelp' to Dutch

* Translate 'selectLanguages' to Dutch

* Transkate 'allowAccessToAllLanguages' to Dutch

* Translate "User permissions for languages" feature to español (#12975)

* Translate 'selectLanguages' to Español

* Translate 'languagesHelp' to español

* Translate 'allowAccessToAllLanguages' to spanish

* Updated project references for Forms and Deploy in the JsonSchema project. (#13047)

* Updated project references for Forms and Deploy in the JsonSchema project. (#13047)

* UmbracoPath has been removed from the official schema store, remove temporary workaround from our schema generator as well (#13043)

* add an extra check to ensure the pips exist before adding a class to them

* improve pip classList add/remove with no intermediary variable

* pass in parameters needed to member service (#13020)

* Missing methods from IMemberService (#13022)

* Add back methods to interface

* Add default implementations to avoid breaking changes

Co-authored-by: Zeegaan <nge@umbraco.dk>

* New endpoint for web profiling dashboard (#13038)

* Endpoint for web profiling dashboard

* Add profiling API contract

* New Backoffice: Published cache controller (#13034)

* Add published cache controller (endpoints for the Published Status dashboard)

* Update OpenAPI contract for published cache endpoints

* Fix OpenApi spec

Co-authored-by: Zeegaan <nge@umbraco.dk>

* Bug fix for datepicker with offset time (#12847)

* https://github.com/umbraco/Umbraco-CMS/issues/12844

* remove "X" from ng-attr

Doing the test I killed the ng-if attr. But forgot it was there doing the commit

Co-authored-by: Lucas Bach Bisgaard <lom@novicell.dk>

* Make sure swagger tags and operations are sorted alphabetically (#13055)

* Add spellcheck false to password inputs (#13059)

* Add null check for variants in Grid Layout (#13060)

This fixes a regression from 10.2.0 where the `variants` property was removed.

* Add null check for variants in Grid Layout (#13060)

This fixes a regression from 10.2.0 where the `variants` property was removed.

* Fixes #12972 for validating legacy member passwords (#12973)

* Fixes #12972 for validating legacy member passwords

* Removed unused variable

* removed unused variable

* Fix issue toggling boolean between true/false after Save without refreshing

* New backoffice: examine management controller (#12981)

* Add ExamineManagementControllerBase

* Add ExamineIndexModelFactory

* Add IndexesExamineManagementController

* Add proper attributes

* Implement ExamineIndexViewModel.cs

* formatting

* Add comment about it working in .NET 7

* Add SearchersExamineManagementController.cs

* Update comments about why it might throw errors

* Add SearchResultViewModel

* Add SearchExamineManagementController

* Add ExamineSearcherValidationService

* Rename ExamineSearcherValidationService.cs to ExamineSearcherFinderService.cs

* Rename interface aswell

* Add SearchExamineManagementController

* Refactor ExamineSearcherFinderService

* Add HasIndexRebuiltExamineManagementController.cs

* Fix up formatting

* Async actions

* Add RebuildIndexExamineManagementController.cs

* Rename IExamineIndexModelFactory to IExamineIndexViewModelFactory

* Refactor HasIndexRebuilt endpoint to Index endpoint

* Remove unused usings

* Fix up DetailsExplanation

* Create dedicated SearchersViewModel

* Rename action

* Rename RebuildIndex to Rebuild

* Dont have changes in ExamineIndexModel

* Make values strongly typed instead of generic lists of strings

* Rename to non-plural

* Rename to non-plural

* Rename controller

* Introduce ITemporaryIndexingService

* Introduce ITemporaryIndexingService

* Add SearcherName to view model

* Move to new ExamineManagementControllerBase.cs

* Refactor ExamineManagerService

* Use init instead of setters

* Make properties explicitly on models

* Add DI

* Apply suggestions from code review

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* Rename to IndexExamineManagementController

* Return ViewModel instead of exception

* Make view models non-nullable

* Add examine management extension point

* Rename to IndexingRebuilderService

* Move rebuild logic to service

* Fix up usages in IIndexingRebuilderService

* Fix up DI

* Fix OpenApi contract

* Implement CanRebuild on IIndexingRebuilderService.cs

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* Update build script

* Add BuildProjectReferences=false to dotnet pack

* Internalize Umbraco.Cms.ManagementApi references

* Make Searchers endpoint return ActionResult (#13068)

* New backoffice - trees design (#12963)

* Refactor: Add default versioned back office route attribute

* Tree controller bases and first draft implementations for document, media and doctype

* Move tree item view models to appropriate location

* Fix missing parent

* Refactor user entity access for testability

* A bit of clean-up + handle user start nodes for items endpoint

* Implement foldersOnly for folder tree

* Items endpoint for document type tree

* Strongly typed action results

* Content + media recycle bin

* Correct return type for swagger

* Member type tree

* Rename user start node handling to make a little more sense

* Revert to faked admin start nodes in document tree

* Media type tree

* Data type tree

* Relation type tree

* Remove unused dependency from member type tree

* Correct documentation for member type tree endpoint response types

* Use icon constants

* Add templates tree

* Member group tree

* Document blueprint tree

* Partial views, scripts and stylesheets trees

* Static files tree

* Clarify "folders only" state

* Comments and improved readability

* Rename TreeControllerBase and TreeItemViewModel

* Move recycle bin controller base to its own namespace

* Moved tree base controllers to their own namespace

* Common base class for tree view models

* Remove ProblemDetails response type declaration from all actions

* Add OpenApiTag

* Various review comments

* Dictionary item tree

* Renamed all tree controllers to follow action/feature naming convention

* Handle client culture state for document tree

* Support "ignore user start nodes" for content and media + refactor how tree states work to make things more explicit

* Fix or postpone a few TODOs

* Make entity service able to paginate trashed children

* Handle sorting explicitly

* Re-apply VersionedApiBackOfficeRoute to install and upgrade controllers after merge

* Use PagedViewModel instead of PagedResult for all trees

* Explain the usage of UmbracoObjectTypes.Unknown

* Introduce and apply GetMany pattern for dictionary items

* Add a note about relation type caching

* Fix broken test build + add unit tests for new localization service methods

* Use new management API controller base

* Entity repository should build document entities for document blueprints when getting paged entities (same as it does when getting specific entities)

* Use Media type for Media recycle bin

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>

* Move shared relation service to concrete implementations

* Use inclusive language

* Add 401 response type documentation to applicable trees

* Refactor entity load for folder tree controller base + ensure that folders are only included in the first result page

* Add (in-memory) pagination to dictionary tree

* Make file system controller honor paging parameters

* Support pagination in relation type tree

* Clarify method name a bit for detecting tree root path requests

* Update Open API schema to match new trees

* Move from page number and page size to skip/take (with temporary workaround for lack of property skip/take pagination in current DB implementation)

* Update OpenAPI schema to match skip/take

* Update OpenAPI schema

* Don't return paginated view models from "items" endpoints

* Update OpenApi schema

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>

* Use pattern matching to check if items is not `JArray`

* Bump Smidge up to v4.1.1

* Removing X-XSS-Protection healthcheck

* Redirect to a return URL if one is present on the querystring when logging into the back office

* Fix issue 13023 - Cannot read properties of undefined (reading 'allowedActions')

* Implement playwright acceptance tests instead of cypress (#13069)

* fix up dependencies in package.json

* Change configs to playwright

* update types

* remove cypress

* add playwright

* Fix up imports

* Move up test files

* Fix up scripts

* Update user import

* Remove allowEditInvariantFromNonDefault=True.spec.ts

* Update docker container

* Run playwright on pipelines

* Install playwright

* change urls

* change to run playwright

* Update reporter

* create .env file when installing

* update pipelines

* Remove @in yml

* Update Yaml script to use New-Item

* Pipe object to Value

* Update yaml to use "" not {}

* Update localhost to proper port

* Push package-lock.json

* include dotenv in package.json

* Add back umbraco.config.ts

* Dont change launchSettings.json

* Fix up pipelines

* Change working directory

* Add logging

* Actually name the file

* Remove .env from path

* Add working directory

* Add working directory to script

* check env content

* Update more working dir

* Try making newline in YAML

* add quotes

* Try multiline infront of script

* Move top statement

* use https

* Update to localhost 44331

* ignore https in config

* Change linux to https

* add timeouts for tests

* Fix up url for linux

* Update docker to use port 44331 -> 5000

* increase timeout

* Update yaml

* Remove Cypress references and fix URL/port mapping

* Update umbraco-linux.docker

* Generate ASP.NET HTTPS development certificate

* Enable HTTPS development certificate in Docker

* Dont run failing tests

* Update HTTPS development certificate generation

* Copy nuget.config to correct location in Docker file

* do not run flaky test

* update outputdir

* Remove flaky tests

* Update to dot reporter

* Update to json-models-builders package

* Check if results folder exists

* Remove logging

* Use bash to find folder

* Dont use junit to report

* only publish if folder exists

* Add 5 retries for CI

* search correct folder

* Remove unused json file

* Use line reporter

* Remove umbraco.config.ts

* Remove more flaky test

* Add waits so we dont bombard SQLite

* Add page as parameter

* add page as parameter

* Remove flaky macro test

Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Ronald Barendse <ronald@barend.se>

* Fix comment of view property in `ConfigurationFieldAttribute` (#13077)

* Fix comment of view property in `ConfigurationFieldAttribute`

* Update description of key property as well

* Use char instead of string for DetectJson (#13019)

* Use char instead of string for DetectJson

* Use faster method

* Change DetectIsJon method

* Update acceptance test readme & scripts (#13078)

* Update readme to reflect the change to playwright

* Update test scripts

* update README

* update pipelines to run new script

* update package.json scripts

* dont include demo test in package.json

* Add creation of blueprint test

* Implement create test script

Co-authored-by: Zeegaan <nge@umbraco.dk>

* Refactor event handler away from keyup to ng-change

* Don't use legacy icon for action delete

* Added nullability attribute to IsNullOrWhitespace

* Fixes umbraco/Umbraco-CMS.Accessibility.Issues #63 and #61

* Revert "Removing X-XSS-Protection healthcheck" (#13096)

This reverts commit 696475ebf2.

Co-authored-by: Zeegaan <nge@umbraco.dk>

* New backoffice: New Api controllers (#12983)

* Create migrate Language controller to Umbraco.Cms:ManagementApi

* Add proper language mapping

* Update mapping to handle if language name is null

* Uncomment code

* Add new language view model

* Add LanguageViewModelMapping

* Add mapper registration

* Fix up AddMappers extension method

* Implement mapping IEnumerable of languages

* Change action signatures to ViewModel instead of model

* Seperate logic from controller into service

* Move LanguageService.cs

* Register service

* Fix up mapping

* Add null check to mapping instead of controller

* Map to ILanguage instead of implementation

* Fix up null check

* Implement ProblemDetailsBuilder.cs

* Rename duplicate method

* Use builder in actions

* Implement new Paged models

* Create language controller base

* Use pagedModel for GetAllLanguages

* Create GetAllLanguagesPaged method

* Split language controller into single APIs

* Fix up controllers with API versions

* Map Total property

* Fix up route and naming for GetLanguageController.cs

* Fix up naming for language controllers

* New folder structure

* Add culture controllers

* Map CultureInfos to paged CultureViewModel

* Remove wierd include in csproj

* Refactor controller to return pagedViewModel instead of dictionary

* Fix up mapping to map single and enumerable

* Register mapping

* Add apiversion to controller

* Add inheritdoc

* Create DictionaryControllerBase.cs

* Add delete controller

* Only use HttpDelete for deletes

* Check also if language exists in service

* Split Save action into Create & Update actions

* Update Http attributes on Create and update controllers

* Proper routing for delete controller

* Add api version

* Make action async

* Implement CreateDictionaryController

* Create DictionaryViewModel.cs

* Use viewmodel instead of values

* Create get by int DictionaryController

* Add view models

* Rename controller

* Rename DictionaryViewModel to DictionaryItemViewModel

* use created instead of ID

* Apply DataContract/Datamember to view model

* change to guid instead of Guid

* Use proper responses instead of return models when creating/updating

* Implement new IDictionaryService

* Implement new MoveController

* Use new service in mapper

* Remove unused method

* Add DictionaryViewModelMapDefinition

* Create MoveOrCopyViewModel

* Proper Http action

* Create UpdateDictionary controller

* Map IDictionaryItem to DictionaryViewModel

* Add JsonPatching

* Add UpdateDictionaryController.cs

* Map DictionaryTranslationsDisplays properly

* ParentId should be nullable

* Add new DictionaryTranslationViewModel.cs

* Remove translationViewModel

* Add Id and Key to DictionaryTranslationDisplay.cs

* Implement IDictionaryFactory.cs

* Create DictionaryViewModels and do not use IEntity

* Map to new view models instead of displays

* Register the factiories in the service container

* Remove newtonsoft

* Add serializing to and from PatchDocs

* Use JsonPatchViewModel instead of object type

* Add JsonPatch.Net to csproj

* Implement JsonPatchService.cs

* Register JsonPatchService

* Make model non-nullable

* Update controllers to use new attributes

* Rename MoveViewModel.cs

* Remove NameIsDirty as that is legacy from how we used to handle updating

* Add GetAllDictionaryController

* Add todo to DictionaryControllerBase

* Add ExportDictionaryController

* Add ImportDictionaryController

* Remove unused umbraco mapper

* Add upload dictionary controller

* Create Dictionary import view models

* Update UploadDictionaryController with view models

* Remove unused using

* Implement pagedviewmodel for GetAllDictionaryController.cs

* Add dictionary overview viewmodels

* Add mapping for DictionaryOverViewModel

* Update Dictionary controller to use new viewmodel

* Fix up attributes for UploadDictionaryController

* Make actions async

* Make controller bases abstract

* Fix after merge

* New backoffice: Analytics controller (#12957)

* Add AnalyticsControllerBase

* Add AnalyticsViewModel

* Add GetAnalyticsController

* Update ViewModel to use System.Text.Json

* Add SetAnalyticsController

* Add AnalyticsLevelViewModel

* Add GetAllAnalyticsController

* Add viewmodel factory

* Register factory for DI

* Use factory for creation of ViewModel

* Fix up AnalyticsLevelViewModel.cs

* Use analyticsLevelViewModel

* Add Enum validation to controller

* Add OpenApi attributes

* Add routing to GetAllAnalyticsController

* Rename IPagedViewModelFactory

* use new renamed PagedViewModelFactory

* Make actions async

* Make controller base abstract

* Fix up after merge

Co-authored-by: Zeegaan <nge@umbraco.dk>

* New backoffice: Help controller (#12958)

* Add HelpControllerBase

* Add HelpPageViewModel

* Add GetHelpController

* Add viewmodel factory

* Register factory for DI

* Use PagedViewModelFactory for controller

* Update baseurl to be nullable

* Rename IPagedViewModelFactory

* Use new renamed IPagedViewModelFactory

* Dont use httpclient as field

Co-authored-by: Zeegaan <nge@umbraco.dk>

* New backoffice: Relation controller (#12961)

* Add relation controller base

* Add commen about auth

* Add GetRelationController

* Use mapping to viewmodel

* Add RelationViewModel

* Add RelationViewModelsMapDefinition.cs

* Add viewmodel factory

* Register factory for DI

* Rename IPagedViewModelFactory

* Add RelationViewModelFactory

* Remove unused service

* Add GetByChildRelationController

* Add relationViewModelFactory to DI

* Add MappingBuilderExtensions

* Add relationViewModelsMapDefinition to DI

* Use PagedViewModel for child relations

* Add CreateMultiple

* Update GetRelationController to use factory instead of direct mapping

* Update GetByChildRelationController to use relationViewModelFactory

* Fix up after merge

Co-authored-by: Zeegaan <nge@umbraco.dk>

* New backoffice: Tracked references controller (#12966)

* Add TrackedReferencesControllerBase.cs

* Add GetTrackedReferencesController

* Add relation model

* Add ITrackedReferencesRepository.cs

* Rename relation to RelationModel

* Add RelationMapDefinition.cs

* Add TrackedReferencesSkipTakeRepository

* Rename RelationModelMapDefinition

* Add new services to DI

* Rename RelationModel to RelationItemModel

* Implement TrackedReferencesSkipTakeService

* Formatting

* Add RelationItemViewModel.cs

* Add mapdefition

* Update TrackedReferencesController to use new PagedViewModel

* Add service to DI

* imlement proper routing

* Add async to GetTrackedReferencesController.cs

* Rename action to get

* Add DescendantTrackedReferencesController

* make filterMustBeIsDependency nullable

* Use count instead of capacity

* Rename controller

* Add MultipleTrackedReferencesController.cs

* Refactor TrackedReferencesService to not return pagedViewModel

* Remove TODO untill consensus on convention

* Formatting

* Delete old duplicate controller

* Fix up naming

* Fix up naming and fixed todo

* Fix up mapdefinition registrations

* Rename controllers

* Fix naming

* Fix nullable tree

* Fix up relation controller & action names

* Fix naming

* Fix up multiple to not be post

* Apply suggestions from code review

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>

* Remove [ApiVersion] from each individual controller and added to base instead

* Added missing semi-colon

* Update all "non-async async" endpoints to return Task.FromResult

* Fixed up LanguageViewModels namespace

* Return proper status code

* Update xml documentation

* Rename GetAllCultureController

* Change return type attribute to proper Model

* Change return type attribute to correct model

* Add clarifying comment

* Change return type attribute to proper model

* Rename ById to by key

* Update DictionaryOverviewViewModel to use Key instead of ID

* Implement factory method to create viewModel instead of using services in mapper

* Fix up DictionaryItemViewModel to use Parent GUID instead of ID

* Update return type attribute to correct model

* Update key to actual GUID instead of string

* Update route to not include "delete"

* Remove redundant IActionResult specification

* Update responseType attribute to correct models

* Update OpenApiTag for DictionaryControllerBase

* Update ResponseType attribute to correct models

* update variable name to not be "XD"

* Update ResponseType attribute to correct model

* Update route to not include "update" as it is redundant

* Update produces responsetype attributes to correct models

* Use IJsonSerializer abstraction instead of JsonConvert directly

* Remove unused field

* Change ResponseType attribute to correct model

* change TrackedReferencesSkipTakeService to return pagedModels directly

* Remove duplicate DI

* change to better variable names

* Move RelationItemModel to core

* Remove empty folder

* Remove ITrackedReferencesSkipTakeService and add it to TrackedReferencesService

* remove TrackedReferencesSkipTakeRepository and add to TrackedReferencesRepository.cs

* Fix up TrackedReferencesService to not use SkipTake repository

* Remove AddRepositories from ManagementApiComposer

* Transition to ManagementApiBaseController

* Fixes ResponseType attribute to correct model

* Add loading files to service instead of having logic in controller

* Add todo comment

* Fix up routing for delete language

* Use problem details builder

* Add SystemTextJsonSerializer

* Add SystemTextJsonSerializer

* Remove unused usings

* Remove obsolete MoveDictionaryController

* Remove CreateDate and UpdateDate from DictionaryViewModel

* Change response type to correct model

* Remove PagedViewModelFactory.cs

* Add obsolete message

* Fix installer view models

A setter is required for the modelbinder to be able to do its work

* Update src/Umbraco.Cms.ManagementApi/Controllers/Analytics/SetAnalyticsController.cs

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>

* Update ResponseType to correct Model

* Update comment

* Add FileUploadService

* Add DictionaryFactory.cs to handle creation of viewmodel

* Remove unused DI

* Rename actions & controllers to reflect eachother

* Update OpenApi.json

* Add dictionary to openapi

* Update in proper alphabetical order

* Add trackedReferences to openapi

* Fix open api doc

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
Co-authored-by: Zeegaan <nge@umbraco.dk>

* Backport project cleanup from #12907

* Remove empty Directory.Build.props

* Fix GenerateAppsettingsSchema target

* Re-add empty Directory.Build.props to prevent inheritance

* Re-add missing JsonPatch.Net dependency

* Fix merge issues (redundant TargetFramework property and appsettings-schema.json generation)

* Fix and improve OpenAPI test assertion

Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
Co-authored-by: Zeegaan <nge@umbraco.dk>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
Co-authored-by: Mads Rasmussen <madsr@hey.com>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Co-authored-by: Bjarne Fyrstenborg <bjarne_fyrstenborg@hotmail.com>
Co-authored-by: Erik-Jan Westendorp <erikjanwestendorp@outlook.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Sean <29239704+Bakersbakebread@users.noreply.github.com>
Co-authored-by: Lucas Bach Bisgaard <rammi@rammi.dk>
Co-authored-by: Lucas Bach Bisgaard <lom@novicell.dk>
Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
Co-authored-by: Busra Sengul <aysebusrasengul@gmail.com>
Co-authored-by: Justin Neville <justin@nevitech.co.uk>
Co-authored-by: Jeavon Leopold <jeavon@crumpled-dog.com>
Co-authored-by: Austin Gilbert <AGilbert@rbaconsulting.com>
Co-authored-by: patrickdemooij9 <patrickdemooij98@hotmail.com>
Co-authored-by: bakersbakebread <hello@seanthorne.co.uk>
Co-authored-by: Karl Butler <kbutler@carbonsix.digital>
2022-10-05 12:14:43 +02:00

944 lines
32 KiB
C#

// Copyright (c) Umbraco.
// See LICENSE for more details.
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Cms.Tests.Common.Builders;
using Umbraco.Cms.Tests.Common.Testing;
using Umbraco.Cms.Tests.Integration.Testing;
using Umbraco.Extensions;
namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services;
/// <summary>
/// Tests covering the EntityService
/// </summary>
[TestFixture]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)]
public class EntityServiceTests : UmbracoIntegrationTest
{
[SetUp]
public void SetupTestData()
{
if (_langFr == null && _langEs == null)
{
_langFr = new Language("fr-FR", "French (France)");
_langEs = new Language("es-ES", "Spanish (Spain)");
LocalizationService.Save(_langFr);
LocalizationService.Save(_langEs);
}
CreateTestData();
}
private Language _langFr;
private Language _langEs;
private ILocalizationService LocalizationService => GetRequiredService<ILocalizationService>();
private IContentTypeService ContentTypeService => GetRequiredService<IContentTypeService>();
private IContentService ContentService => GetRequiredService<IContentService>();
private IEntityService EntityService => GetRequiredService<IEntityService>();
private ISqlContext SqlContext => GetRequiredService<ISqlContext>();
private IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
private IMediaService MediaService => GetRequiredService<IMediaService>();
private IFileService FileService => GetRequiredService<IFileService>();
[Test]
public void EntityService_Can_Get_Paged_Descendants_Ordering_Path()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var rootId = root.Id;
var ids = new List<int>();
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
ids.Add(c1.Id);
root = c1; // make a hierarchy
}
var entities = EntityService.GetPagedDescendants(rootId, UmbracoObjectTypes.Document, 0, 6, out var total)
.ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[0], entities[0].Id);
entities = EntityService.GetPagedDescendants(rootId, UmbracoObjectTypes.Document, 1, 6, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[6], entities[0].Id);
// Test ordering direction
entities = EntityService.GetPagedDescendants(
rootId,
UmbracoObjectTypes.Document,
0,
6,
out total,
ordering: Ordering.By("Path", Direction.Descending)).ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[^1], entities[0].Id);
entities = EntityService.GetPagedDescendants(
rootId,
UmbracoObjectTypes.Document,
1,
6,
out total,
ordering: Ordering.By("Path", Direction.Descending)).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[ids.Count - 1 - 6], entities[0].Id);
}
[Test]
public void EntityService_Can_Get_Paged_Content_Children()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var ids = new List<int>();
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
ids.Add(c1.Id);
}
var entities = EntityService.GetPagedChildren(root.Id, UmbracoObjectTypes.Document, 0, 6, out var total)
.ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[0], entities[0].Id);
entities = EntityService.GetPagedChildren(root.Id, UmbracoObjectTypes.Document, 1, 6, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[6], entities[0].Id);
// Test ordering direction
entities = EntityService.GetPagedChildren(
root.Id,
UmbracoObjectTypes.Document,
0,
6,
out total,
ordering: Ordering.By("SortOrder", Direction.Descending)).ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[^1], entities[0].Id);
entities = EntityService.GetPagedChildren(
root.Id,
UmbracoObjectTypes.Document,
1,
6,
out total,
ordering: Ordering.By("SortOrder", Direction.Descending)).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
Assert.AreEqual(ids[ids.Count - 1 - 6], entities[0].Id);
}
[Test]
public void EntityService_Can_Get_Paged_Content_Descendants()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var count = 0;
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
count++;
for (var j = 0; j < 5; j++)
{
var c2 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), c1);
ContentService.Save(c2);
count++;
}
}
var entities = EntityService.GetPagedDescendants(root.Id, UmbracoObjectTypes.Document, 0, 31, out var total)
.ToArray();
Assert.That(entities.Length, Is.EqualTo(31));
Assert.That(total, Is.EqualTo(60));
entities = EntityService.GetPagedDescendants(root.Id, UmbracoObjectTypes.Document, 1, 31, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(29));
Assert.That(total, Is.EqualTo(60));
}
[Test]
public void EntityService_Can_Get_Paged_Content_Descendants_Including_Recycled()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var toDelete = new List<IContent>();
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), c1);
ContentService.Save(c2);
}
}
foreach (var content in toDelete)
{
ContentService.MoveToRecycleBin(content);
}
// search at root to see if it returns recycled
var entities = EntityService.GetPagedDescendants(-1, UmbracoObjectTypes.Document, 0, 1000, out var total)
.Select(x => x.Id)
.ToArray();
foreach (var c in toDelete)
{
Assert.True(entities.Contains(c.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Content_Descendants_Without_Recycled()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var toDelete = new List<IContent>();
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), c1);
ContentService.Save(c2);
}
}
foreach (var content in toDelete)
{
ContentService.MoveToRecycleBin(content);
}
// search at root to see if it returns recycled
var entities = EntityService
.GetPagedDescendants(UmbracoObjectTypes.Document, 0, 1000, out var total, includeTrashed: false)
.Select(x => x.Id)
.ToArray();
foreach (var c in toDelete)
{
Assert.IsFalse(entities.Contains(c.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Trashed_Content_Children()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
var toDelete = new List<IContent>();
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
ContentService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), c1);
ContentService.Save(c2);
}
}
foreach (var content in toDelete)
{
ContentService.MoveToRecycleBin(content);
}
// get paged entities at recycle bin root
var entities = EntityService
.GetPagedTrashedChildren(Constants.System.RecycleBinContent, UmbracoObjectTypes.Document, 0, 1000, out var total)
.Select(x => x.Id)
.ToArray();
Assert.True(total > 0);
foreach (var c in toDelete)
{
Assert.IsTrue(entities.Contains(c.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Content_Descendants_With_Search()
{
var contentType = ContentTypeService.Get("umbTextpage");
var root = ContentBuilder.CreateSimpleContent(contentType);
ContentService.Save(root);
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, "ssss" + Guid.NewGuid(), root);
ContentService.Save(c1);
for (var j = 0; j < 5; j++)
{
var c2 = ContentBuilder.CreateSimpleContent(contentType, "tttt" + Guid.NewGuid(), c1);
ContentService.Save(c2);
}
}
var entities = EntityService.GetPagedDescendants(
root.Id,
UmbracoObjectTypes.Document,
0,
10,
out var total,
SqlContext.Query<IUmbracoEntity>().Where(x => x.Name.Contains("ssss"))).ToArray();
Assert.That(entities.Length, Is.EqualTo(10));
Assert.That(total, Is.EqualTo(10));
entities = EntityService.GetPagedDescendants(
root.Id,
UmbracoObjectTypes.Document,
0,
50,
out total,
SqlContext.Query<IUmbracoEntity>().Where(x => x.Name.Contains("tttt"))).ToArray();
Assert.That(entities.Length, Is.EqualTo(50));
Assert.That(total, Is.EqualTo(50));
}
[Test]
public void EntityService_Can_Get_Paged_Media_Children()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
MediaService.Save(c1);
}
var entities = EntityService.GetPagedChildren(root.Id, UmbracoObjectTypes.Media, 0, 6, out var total).ToArray();
Assert.That(entities.Length, Is.EqualTo(6));
Assert.That(total, Is.EqualTo(10));
entities = EntityService.GetPagedChildren(root.Id, UmbracoObjectTypes.Media, 1, 6, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(total, Is.EqualTo(10));
}
[Test]
public void EntityService_Can_Get_Paged_Media_Descendants()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
var count = 0;
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
MediaService.Save(c1);
count++;
for (var j = 0; j < 5; j++)
{
var c2 = MediaBuilder.CreateMediaImage(imageMediaType, c1.Id);
MediaService.Save(c2);
count++;
}
}
var entities = EntityService.GetPagedDescendants(root.Id, UmbracoObjectTypes.Media, 0, 31, out var total)
.ToArray();
Assert.That(entities.Length, Is.EqualTo(31));
Assert.That(total, Is.EqualTo(60));
entities = EntityService.GetPagedDescendants(root.Id, UmbracoObjectTypes.Media, 1, 31, out total).ToArray();
Assert.That(entities.Length, Is.EqualTo(29));
Assert.That(total, Is.EqualTo(60));
}
[Test]
public void EntityService_Can_Get_Paged_Media_Descendants_Including_Recycled()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
var toDelete = new List<IMedia>();
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
MediaService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = MediaBuilder.CreateMediaImage(imageMediaType, c1.Id);
MediaService.Save(c2);
}
}
foreach (var content in toDelete)
{
MediaService.MoveToRecycleBin(content);
}
// search at root to see if it returns recycled
var entities = EntityService.GetPagedDescendants(-1, UmbracoObjectTypes.Media, 0, 1000, out var total)
.Select(x => x.Id)
.ToArray();
foreach (var media in toDelete)
{
Assert.IsTrue(entities.Contains(media.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Media_Descendants_Without_Recycled()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
var toDelete = new List<IMedia>();
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
MediaService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = MediaBuilder.CreateMediaImage(imageMediaType, c1.Id);
MediaService.Save(c2);
}
}
foreach (var content in toDelete)
{
MediaService.MoveToRecycleBin(content);
}
// search at root to see if it returns recycled
var entities = EntityService
.GetPagedDescendants(UmbracoObjectTypes.Media, 0, 1000, out var total, includeTrashed: false)
.Select(x => x.Id)
.ToArray();
foreach (var media in toDelete)
{
Assert.IsFalse(entities.Contains(media.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Trashed_Media_Children()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
var toDelete = new List<IMedia>();
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
MediaService.Save(c1);
if (i % 2 == 0)
{
toDelete.Add(c1);
}
for (var j = 0; j < 5; j++)
{
var c2 = MediaBuilder.CreateMediaImage(imageMediaType, c1.Id);
MediaService.Save(c2);
}
}
foreach (var content in toDelete)
{
MediaService.MoveToRecycleBin(content);
}
// get paged entities at recycle bin root
var entities = EntityService
.GetPagedTrashedChildren(Constants.System.RecycleBinMedia, UmbracoObjectTypes.Media, 0, 1000, out var total)
.Select(x => x.Id)
.ToArray();
Assert.True(total > 0);
foreach (var media in toDelete)
{
Assert.IsTrue(entities.Contains(media.Id));
}
}
[Test]
public void EntityService_Can_Get_Paged_Media_Descendants_With_Search()
{
var folderType = MediaTypeService.Get(1031);
var imageMediaType = MediaTypeService.Get(1032);
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
for (var i = 0; i < 10; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
c1.Name = "ssss" + Guid.NewGuid();
MediaService.Save(c1);
for (var j = 0; j < 5; j++)
{
var c2 = MediaBuilder.CreateMediaImage(imageMediaType, c1.Id);
c2.Name = "tttt" + Guid.NewGuid();
MediaService.Save(c2);
}
}
var entities = EntityService.GetPagedDescendants(
root.Id,
UmbracoObjectTypes.Media,
0,
10,
out var total,
SqlContext.Query<IUmbracoEntity>().Where(x => x.Name.Contains("ssss"))).ToArray();
Assert.That(entities.Length, Is.EqualTo(10));
Assert.That(total, Is.EqualTo(10));
entities = EntityService.GetPagedDescendants(
root.Id,
UmbracoObjectTypes.Media,
0,
50,
out total,
SqlContext.Query<IUmbracoEntity>().Where(x => x.Name.Contains("tttt"))).ToArray();
Assert.That(entities.Length, Is.EqualTo(50));
Assert.That(total, Is.EqualTo(50));
}
[Test]
public void EntityService_Can_Find_All_Content_By_UmbracoObjectTypes()
{
var entities = EntityService.GetAll(UmbracoObjectTypes.Document).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(entities.Any(x => x.Trashed), Is.True);
}
[Test]
public void EntityService_Can_Find_All_Content_By_UmbracoObjectType_Id()
{
var objectTypeId = Constants.ObjectTypes.Document;
var entities = EntityService.GetAll(objectTypeId).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(entities.Any(x => x.Trashed), Is.True);
}
[Test]
public void EntityService_Can_Find_All_Content_By_Type()
{
var entities = EntityService.GetAll<IContent>().ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Length, Is.EqualTo(4));
Assert.That(entities.Any(x => x.Trashed), Is.True);
}
[Test]
public void EntityService_Can_Get_Child_Content_By_ParentId_And_UmbracoObjectType()
{
var entities = EntityService.GetChildren(-1, UmbracoObjectTypes.Document).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Length, Is.EqualTo(1));
Assert.That(entities.Any(x => x.Trashed), Is.False);
}
[Test]
public void EntityService_Can_Get_Content_By_UmbracoObjectType_With_Variant_Names()
{
var alias = "test" + Guid.NewGuid();
var template = TemplateBuilder.CreateTextPageTemplate(alias);
FileService.SaveTemplate(template);
var contentType = ContentTypeBuilder.CreateSimpleContentType("test2", "Test2", defaultTemplateId: template.Id);
contentType.Variations = ContentVariation.Culture;
ContentTypeService.Save(contentType);
var c1 = ContentBuilder.CreateSimpleContent(contentType, "Test");
c1.SetCultureName("Test - FR", _langFr.IsoCode);
c1.SetCultureName("Test - ES", _langEs.IsoCode);
ContentService.Save(c1);
var result = EntityService.Get(c1.Id, UmbracoObjectTypes.Document);
Assert.AreEqual("Test - FR", result.Name); // got name from default culture
Assert.IsNotNull(result as IDocumentEntitySlim);
var doc = (IDocumentEntitySlim)result;
var cultureNames = doc.CultureNames;
Assert.AreEqual("Test - FR", cultureNames[_langFr.IsoCode]);
Assert.AreEqual("Test - ES", cultureNames[_langEs.IsoCode]);
}
[Test]
public void EntityService_Can_Get_Child_Content_By_ParentId_And_UmbracoObjectType_With_Variant_Names()
{
var template = TemplateBuilder.CreateTextPageTemplate();
FileService.SaveTemplate(template);
var contentType = ContentTypeBuilder.CreateSimpleContentType("test1", "Test1", defaultTemplateId: template.Id);
contentType.Variations = ContentVariation.Culture;
ContentTypeService.Save(contentType);
var root = ContentBuilder.CreateSimpleContent(contentType);
root.SetCultureName("Root", _langFr.IsoCode); // else cannot save
ContentService.Save(root);
for (var i = 0; i < 10; i++)
{
var c1 = ContentBuilder.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root);
if (i % 2 == 0)
{
c1.SetCultureName("Test " + i + " - FR", _langFr.IsoCode);
c1.SetCultureName("Test " + i + " - ES", _langEs.IsoCode);
}
else
{
c1.SetCultureName("Test", _langFr.IsoCode); // else cannot save
}
ContentService.Save(c1);
}
var entities = EntityService.GetChildren(root.Id, UmbracoObjectTypes.Document).ToArray();
Assert.AreEqual(10, entities.Length);
for (var i = 0; i < entities.Length; i++)
{
Assert.AreEqual(0, entities[i].AdditionalData.Count);
if (i % 2 == 0)
{
var doc = (IDocumentEntitySlim)entities[i];
var keys = doc.CultureNames.Keys.ToList();
var vals = doc.CultureNames.Values.ToList();
Assert.AreEqual(_langFr.IsoCode.ToLowerInvariant(), keys[0].ToLowerInvariant());
Assert.AreEqual("Test " + i + " - FR", vals[0]);
Assert.AreEqual(_langEs.IsoCode.ToLowerInvariant(), keys[1].ToLowerInvariant());
Assert.AreEqual("Test " + i + " - ES", vals[1]);
}
else
{
Assert.AreEqual(0, entities[i].AdditionalData.Count);
}
}
}
[Test]
public void EntityService_Can_Get_Children_By_ParentId()
{
var entities = EntityService.GetChildren(_folderId);
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Count(), Is.EqualTo(3));
Assert.That(entities.Any(x => x.Trashed), Is.False);
}
[Test]
public void EntityService_Can_Get_Descendants_By_ParentId()
{
var entities = EntityService.GetDescendants(_folderId);
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Count(), Is.EqualTo(4));
Assert.That(entities.Any(x => x.Trashed), Is.False);
}
[Test]
public void EntityService_Throws_When_Getting_All_With_Invalid_Type()
{
var objectTypeId = Constants.ObjectTypes.ContentItem;
Assert.Throws<NotSupportedException>(() => EntityService.GetAll<IContentBase>());
Assert.Throws<NotSupportedException>(() => EntityService.GetAll(objectTypeId));
}
[Test]
public void EntityService_Can_Find_All_ContentTypes_By_UmbracoObjectTypes()
{
var entities = EntityService.GetAll(UmbracoObjectTypes.DocumentType).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Count(), Is.EqualTo(1));
}
[Test]
public void EntityService_Can_Find_All_ContentTypes_By_UmbracoObjectType_Id()
{
var objectTypeId = Constants.ObjectTypes.DocumentType;
var entities = EntityService.GetAll(objectTypeId).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Count(), Is.EqualTo(1));
}
[Test]
public void EntityService_Can_Find_All_ContentTypes_By_Type()
{
var entities = EntityService.GetAll<IContentType>().ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Count(), Is.EqualTo(1));
}
[Test]
public void EntityService_Can_Find_All_Media_By_UmbracoObjectTypes()
{
var entities = EntityService.GetAll(UmbracoObjectTypes.Media).ToArray();
Assert.That(entities.Any(), Is.True);
Assert.That(entities.Length, Is.EqualTo(5));
foreach (var entity in entities)
{
Assert.IsTrue(entity.GetType().Implements<IMediaEntitySlim>());
Console.WriteLine(((IMediaEntitySlim)entity).MediaPath);
Assert.IsNotEmpty(((IMediaEntitySlim)entity).MediaPath);
}
}
[Test]
public void EntityService_Can_Get_ObjectType()
{
var mediaObjectType = EntityService.GetObjectType(1031);
Assert.NotNull(mediaObjectType);
Assert.AreEqual(mediaObjectType, UmbracoObjectTypes.MediaType);
}
[Test]
public void EntityService_Can_Get_Key_For_Id_With_Unknown_Type()
{
var result = EntityService.GetKey(_contentType.Id, UmbracoObjectTypes.Unknown);
Assert.IsTrue(result.Success);
Assert.AreEqual(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), result.Result);
}
[Test]
public void EntityService_Can_Get_Key_For_Id()
{
var result = EntityService.GetKey(_contentType.Id, UmbracoObjectTypes.DocumentType);
Assert.IsTrue(result.Success);
Assert.AreEqual(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), result.Result);
}
[Test]
public void EntityService_Cannot_Get_Key_For_Id_With_Incorrect_Object_Type()
{
var result1 = EntityService.GetKey(_contentType.Id, UmbracoObjectTypes.DocumentType);
var result2 = EntityService.GetKey(_contentType.Id, UmbracoObjectTypes.MediaType);
Assert.IsTrue(result1.Success);
Assert.IsFalse(result2.Success);
}
[Test]
public void EntityService_Can_Get_Id_For_Key_With_Unknown_Type()
{
var result =
EntityService.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.Unknown);
Assert.IsTrue(result.Success);
Assert.AreEqual(_contentType.Id, result.Result);
}
[Test]
public void EntityService_Can_Get_Id_For_Key()
{
var result = EntityService.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"),
UmbracoObjectTypes.DocumentType);
Assert.IsTrue(result.Success);
Assert.AreEqual(_contentType.Id, result.Result);
}
[Test]
public void EntityService_Cannot_Get_Id_For_Key_With_Incorrect_Object_Type()
{
var result1 = EntityService.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"),
UmbracoObjectTypes.DocumentType);
var result2 = EntityService.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"),
UmbracoObjectTypes.MediaType);
Assert.IsTrue(result1.Success);
Assert.IsFalse(result2.Success);
}
[Test]
public void ReserveId()
{
var guid = Guid.NewGuid();
// can reserve
var reservedId = EntityService.ReserveId(guid);
Assert.IsTrue(reservedId > 0);
// can get it back
var id = EntityService.GetId(guid, UmbracoObjectTypes.DocumentType);
Assert.IsTrue(id.Success);
Assert.AreEqual(reservedId, id.Result);
// anything goes
id = EntityService.GetId(guid, UmbracoObjectTypes.Media);
Assert.IsTrue(id.Success);
Assert.AreEqual(reservedId, id.Result);
// a random guid won't work
Assert.IsFalse(EntityService.GetId(Guid.NewGuid(), UmbracoObjectTypes.DocumentType).Success);
}
private static bool s_isSetup;
private int _folderId;
private ContentType _contentType;
private Content _textpage;
private Content _subpage;
private Content _subpage2;
private Content _trashed;
private IMediaType _folderMediaType;
private Media _folder;
private IMediaType _imageMediaType;
private Media _image;
private Media _subfolder;
private Media _subfolder2;
public void CreateTestData()
{
if (s_isSetup == false)
{
s_isSetup = true;
var template = TemplateBuilder.CreateTextPageTemplate();
FileService.SaveTemplate(template); // else, FK violation on contentType!
// Create and Save ContentType "umbTextpage" -> _contentType.Id
_contentType =
ContentTypeBuilder.CreateSimpleContentType("umbTextpage", "Textpage", defaultTemplateId: template.Id);
_contentType.Key = new Guid("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522");
ContentTypeService.Save(_contentType);
// Create and Save Content "Homepage" based on "umbTextpage" -> 1053
_textpage = ContentBuilder.CreateSimpleContent(_contentType);
_textpage.Key = new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0");
ContentService.Save(_textpage, 0);
// Create and Save Content "Text Page 1" based on "umbTextpage" -> 1054
_subpage = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 1", _textpage.Id);
var contentSchedule = ContentScheduleCollection.CreateWithEntry(DateTime.Now.AddMinutes(-5), null);
ContentService.Save(_subpage, 0, contentSchedule);
// Create and Save Content "Text Page 2" based on "umbTextpage" -> 1055
_subpage2 = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 2", _textpage.Id);
ContentService.Save(_subpage2, 0);
// Create and Save Content "Text Page Deleted" based on "umbTextpage" -> 1056
_trashed = ContentBuilder.CreateSimpleContent(_contentType, "Text Page Deleted", -20);
_trashed.Trashed = true;
ContentService.Save(_trashed, 0);
// Create and Save folder-Media -> 1057
_folderMediaType = MediaTypeService.Get(1031);
_folder = MediaBuilder.CreateMediaFolder(_folderMediaType, -1);
MediaService.Save(_folder, 0);
_folderId = _folder.Id;
// Create and Save image-Media -> 1058
_imageMediaType = MediaTypeService.Get(1032);
_image = MediaBuilder.CreateMediaImage(_imageMediaType, _folder.Id);
MediaService.Save(_image, 0);
// Create and Save file-Media -> 1059
var fileMediaType = MediaTypeService.Get(1033);
var file = MediaBuilder.CreateMediaFile(fileMediaType, _folder.Id);
MediaService.Save(file, 0);
// Create and save sub folder -> 1060
_subfolder = MediaBuilder.CreateMediaFolder(_folderMediaType, _folder.Id);
MediaService.Save(_subfolder, 0);
// Create and save sub folder -> 1061
_subfolder2 = MediaBuilder.CreateMediaFolder(_folderMediaType, _subfolder.Id);
MediaService.Save(_subfolder2, 0);
}
}
}