/*
  * NOTE FOR DEVELOPERS:
  *
  * Never modify or reference this class directly. All methods that expect a k b folder model instance should use the {@link KBFolder} interface instead.
  */
 @Override
 public void persist() {
   if (this.isNew()) {
     KBFolderLocalServiceUtil.addKBFolder(this);
   } else {
     KBFolderLocalServiceUtil.updateKBFolder(this);
   }
 }
  @Test
  public void testMoveKBFolderToParentKBFolderInKBFolder() throws Exception {
    KBFolder kbFolder = addKBFolder(_kbFolder.getKbFolderId());
    KBFolder parentKBFolder = addKBFolder(_kbFolder.getKbFolderId());

    KBFolderLocalServiceUtil.moveKBFolder(kbFolder.getKbFolderId(), parentKBFolder.getKbFolderId());

    kbFolder = KBFolderLocalServiceUtil.getKBFolder(kbFolder.getKbFolderId());

    Assert.assertEquals(parentKBFolder.getKbFolderId(), kbFolder.getParentKBFolderId());
  }
  @Test
  public void testMoveKBFolderToParentKBFolderInHomeKBFolder() throws Exception {

    KBFolder kbFolder = addKBFolder(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID);
    KBFolder parentKBFolder = addKBFolder(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID);

    KBFolderLocalServiceUtil.moveKBFolder(kbFolder.getKbFolderId(), parentKBFolder.getKbFolderId());

    kbFolder = KBFolderLocalServiceUtil.getKBFolder(kbFolder.getKbFolderId());

    Assert.assertEquals(parentKBFolder.getKbFolderId(), kbFolder.getParentKBFolderId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesReturnKBFolderImmediateChildren() throws Exception {

    KBArticle parentKBArticle =
        addKBArticle(_kbFolder.getKbFolderId(), RandomTestUtil.randomString());

    addChildKBArticle(parentKBArticle, RandomTestUtil.randomString());

    KBFolder kbFolder = addKBFolder(_kbFolder.getKbFolderId());

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            _kbFolder.getKbFolderId(),
            WorkflowConstants.STATUS_APPROVED,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsTitleComparator<KBArticle>(true, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(1);

    Assert.assertEquals(kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(parentKBArticle.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(2, kbFolderAndKBArticles.size());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesOrderedByDescendingViewCount() throws Exception {

    KBArticle kbArticle1 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "A");
    KBArticle kbArticle2 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "B");
    KBArticle kbArticle3 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "C");

    KBArticleLocalServiceUtil.updateViewCount(
        kbArticle2.getUserId(), kbArticle2.getResourcePrimKey(), kbArticle2.getViewCount() + 1000);

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsViewCountComparator(false));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(2);
    KBArticle currentKBArticle2 = (KBArticle) kbFolderAndKBArticles.get(1);
    KBArticle currentKBArticle3 = (KBArticle) kbFolderAndKBArticles.get(3);

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(kbArticle1.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(kbArticle2.getKbArticleId(), currentKBArticle2.getKbArticleId());
    Assert.assertEquals(kbArticle3.getKbArticleId(), currentKBArticle3.getKbArticleId());
  }
  @Test(expected = NoSuchFolderException.class)
  public void testMoveKBFolderToParentKBArticle() throws Exception {
    KBFolder kbFolder = addKBFolder(_kbFolder.getKbFolderId());
    KBArticle kbArticle = addKBArticle(_kbFolder.getKbFolderId(), RandomTestUtil.randomString());

    KBFolderLocalServiceUtil.moveKBFolder(kbFolder.getKbFolderId(), kbArticle.getResourcePrimKey());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesWithMultipleKBArticleVersions() throws Exception {

    KBArticle kbArticle =
        addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());

    KBArticle newKBArticle = updateKBArticle(kbArticle, RandomTestUtil.randomString());

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsTitleComparator<>(false, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(1);

    Assert.assertEquals(2, kbFolderAndKBArticles.size());

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(newKBArticle.getKbArticleId(), currentKBArticle1.getKbArticleId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesOrderedByDescendingModifiedDate() throws Exception {

    Date date = new Date();

    KBArticle kbArticle1 =
        addKBArticle(
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, new Date(date.getTime() + Time.SECOND));
    KBArticle kbArticle2 =
        addKBArticle(
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, new Date(date.getTime() + Time.SECOND * 3));
    KBArticle kbArticle3 =
        addKBArticle(
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, new Date(date.getTime() + Time.SECOND * 2));

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsModifiedDateComparator(false, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(3);
    KBArticle currentKBArticle2 = (KBArticle) kbFolderAndKBArticles.get(1);
    KBArticle currentKBArticle3 = (KBArticle) kbFolderAndKBArticles.get(2);

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(kbArticle1.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(kbArticle2.getKbArticleId(), currentKBArticle2.getKbArticleId());
    Assert.assertEquals(kbArticle3.getKbArticleId(), currentKBArticle3.getKbArticleId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesOrderedByAscendingTitle() throws Exception {

    KBArticle kbArticle1 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "A");
    KBArticle kbArticle2 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "C");
    KBArticle kbArticle3 = addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, "B");

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsTitleComparator(true, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(1);
    KBArticle currentKBArticle2 = (KBArticle) kbFolderAndKBArticles.get(3);
    KBArticle currentKBArticle3 = (KBArticle) kbFolderAndKBArticles.get(2);

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(kbArticle1.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(kbArticle2.getKbArticleId(), currentKBArticle2.getKbArticleId());
    Assert.assertEquals(kbArticle3.getKbArticleId(), currentKBArticle3.getKbArticleId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesOrderedByAscendingPriority() throws Exception {

    KBArticle kbArticle1 =
        addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());
    KBArticle kbArticle2 =
        addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());
    KBArticle kbArticle3 =
        addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());

    KBArticleLocalServiceUtil.updatePriority(kbArticle2.getResourcePrimKey(), 10.0);

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsPriorityComparator(true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(1);
    KBArticle currentKBArticle2 = (KBArticle) kbFolderAndKBArticles.get(3);
    KBArticle currentKBArticle3 = (KBArticle) kbFolderAndKBArticles.get(2);

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(kbArticle1.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(kbArticle2.getKbArticleId(), currentKBArticle2.getKbArticleId());
    Assert.assertEquals(kbArticle3.getKbArticleId(), currentKBArticle3.getKbArticleId());
  }
  @Test(expected = KBFolderParentException.class)
  public void testMoveKBArticleToInvalidParentKBFolder() throws Exception {
    KBFolder kbFolder = addKBFolder(_kbFolder.getKbFolderId());

    KBFolder kbSubfolder = addKBFolder(kbFolder.getKbFolderId());

    KBFolderLocalServiceUtil.moveKBFolder(kbFolder.getKbFolderId(), kbSubfolder.getKbFolderId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesCountInRootKBFolderByDraftStatus() throws Exception {

    addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());

    Assert.assertEquals(
        1,
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticlesCount(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_DRAFT));
  }
  @Test
  public void testGetKBFoldersAndKBArticlesCountInKBFolder() throws Exception {

    addKBArticle(_kbFolder.getKbFolderId(), RandomTestUtil.randomString());
    addKBArticle(_kbFolder.getKbFolderId(), RandomTestUtil.randomString());

    addKBFolder(_kbFolder.getKbFolderId());

    Assert.assertEquals(
        3,
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticlesCount(
            _group.getGroupId(), _kbFolder.getKbFolderId(), WorkflowConstants.STATUS_ANY));
  }
  protected KBFolder addKBFolder(long parentResourcePrimKey)
      throws com.liferay.portal.kernel.exception.PortalException {

    ServiceContext serviceContext =
        ServiceContextTestUtil.getServiceContext(_group, _user.getUserId());

    return KBFolderLocalServiceUtil.addKBFolder(
        _user.getUserId(),
        _group.getGroupId(),
        PortalUtil.getClassNameId(KBFolderConstants.getClassName()),
        parentResourcePrimKey,
        RandomTestUtil.randomString(),
        RandomTestUtil.randomString(),
        serviceContext);
  }
  @Test
  public void testGetKBFoldersAndKBArticlesCountWithMultipleKBArticleVersions() throws Exception {

    KBArticle kbArticle =
        addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());

    updateKBArticle(kbArticle, RandomTestUtil.randomString());

    Assert.assertEquals(
        2,
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticlesCount(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_ANY));
  }
  @Test
  public void testGetKBFoldersAndKBArticlesCountKBFolderImmediateChildren() throws Exception {

    KBArticle parentKBArticle =
        addKBArticle(_kbFolder.getKbFolderId(), RandomTestUtil.randomString());

    addChildKBArticle(parentKBArticle, RandomTestUtil.randomString());

    addKBFolder(_kbFolder.getKbFolderId());

    Assert.assertEquals(
        2,
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticlesCount(
            _group.getGroupId(), _kbFolder.getKbFolderId(), WorkflowConstants.STATUS_ANY));
  }
  @Test
  public void testGetKBFoldersAndKBArticlesInRootKBFolderByDraftStatus() throws Exception {

    addKBArticle(KBFolderConstants.DEFAULT_PARENT_FOLDER_ID, RandomTestUtil.randomString());

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            KBFolderConstants.DEFAULT_PARENT_FOLDER_ID,
            WorkflowConstants.STATUS_DRAFT,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsTitleComparator<>(false, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);

    Assert.assertEquals(1, kbFolderAndKBArticles.size());

    Assert.assertEquals(_kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
  }
  @Test
  public void testGetKBFoldersAndKBArticlesInKBFolder() throws Exception {
    KBArticle kbArticle1 = addKBArticle(_kbFolder.getKbFolderId(), "A");
    KBArticle kbArticle2 = addKBArticle(_kbFolder.getKbFolderId(), "B");

    KBFolder kbFolder = addKBFolder(_kbFolder.getKbFolderId());

    List<Object> kbFolderAndKBArticles =
        KBFolderLocalServiceUtil.getKBFoldersAndKBArticles(
            _group.getGroupId(),
            _kbFolder.getKbFolderId(),
            WorkflowConstants.STATUS_APPROVED,
            QueryUtil.ALL_POS,
            QueryUtil.ALL_POS,
            new KBObjectsTitleComparator<KBArticle>(true, true));

    KBFolder currentKBFolder = (KBFolder) kbFolderAndKBArticles.get(0);
    KBArticle currentKBArticle1 = (KBArticle) kbFolderAndKBArticles.get(1);
    KBArticle currentKBArticle2 = (KBArticle) kbFolderAndKBArticles.get(2);

    Assert.assertEquals(kbFolder.getKbFolderId(), currentKBFolder.getKbFolderId());
    Assert.assertEquals(kbArticle1.getKbArticleId(), currentKBArticle1.getKbArticleId());
    Assert.assertEquals(kbArticle2.getKbArticleId(), currentKBArticle2.getKbArticleId());
  }