#16 board: add domain - hashtag

This commit is contained in:
haerong22
2023-01-19 03:55:04 +09:00
parent b26fe0853f
commit 16f74f627b
22 changed files with 1219 additions and 358 deletions

View File

@@ -5,6 +5,7 @@ import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
@@ -13,7 +14,6 @@ import java.util.Set;
@ToString(callSuper = true)
@Table(indexes = {
@Index(columnList = "title"),
@Index(columnList = "hashtag"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@@ -37,8 +37,14 @@ public class Article extends AuditingFields {
@Column(nullable = false, length = 10000)
private String content; // 본문
@Setter
private String hashtag; // 해시태그
@ToString.Exclude
@JoinTable(
name = "article_hashtag",
joinColumns = @JoinColumn(name = "articleId"),
inverseJoinColumns = @JoinColumn(name = "hashtagId")
)
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Hashtag> hashtags = new LinkedHashSet<>();
@OrderBy("createdAt DESC")
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
@@ -47,15 +53,26 @@ public class Article extends AuditingFields {
protected Article() {}
private Article(UserAccount userAccount, String title, String content, String hashtag) {
private Article(UserAccount userAccount, String title, String content) {
this.userAccount = userAccount;
this.title = title;
this.content = content;
this.hashtag = hashtag;
}
public static Article of(UserAccount userAccount, String title, String content, String hashtag) {
return new Article(userAccount, title, content, hashtag);
public static Article of(UserAccount userAccount, String title, String content) {
return new Article(userAccount, title, content);
}
public void addHashtag(Hashtag hashtag) {
this.getHashtags().addAll(hashtags);
}
public void addHashtags(Collection<Hashtag> hashtags) {
this.getHashtags().addAll(hashtags);
}
public void clearHashtags() {
this.getHashtags().clear();
}
@Override

View File

@@ -0,0 +1,55 @@
package com.example.board.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
@Getter
@Table(indexes = {
@Index(columnList = "hashtagName", unique = true),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@ToString(callSuper = true)
@Entity
public class Hashtag extends AuditingFields {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ToString.Exclude
@ManyToMany(mappedBy = "hashtags")
private Set<Article> articles = new LinkedHashSet<>();
@Setter
@Column(nullable = false)
private String hashtagName;
protected Hashtag() {}
private Hashtag(String hashtagName) {
this.hashtagName = hashtagName;
}
public static Hashtag of(String hashtagName) {
return new Hashtag(hashtagName);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Hashtag that)) return false;
return this.getId() != null && this.getId().equals(that.getId());
}
@Override
public int hashCode() {
return Objects.hash(this.getId());
}
}

View File

@@ -4,25 +4,27 @@ import com.example.board.domain.Article;
import com.example.board.domain.UserAccount;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.stream.Collectors;
public record ArticleDto(
Long id,
UserAccountDto userAccountDto,
String title,
String content,
String hashtag,
Set<HashtagDto> hashtagDtos,
LocalDateTime createdAt,
String createdBy,
LocalDateTime modifiedAt,
String modifiedBy
) {
public static ArticleDto of(UserAccountDto userAccountDto, String title, String content, String hashtag) {
return new ArticleDto(null, userAccountDto, title, content, hashtag, null, null, null, null);
public static ArticleDto of(UserAccountDto userAccountDto, String title, String content, Set<HashtagDto> hashtagDtos) {
return new ArticleDto(null, userAccountDto, title, content, hashtagDtos, null, null, null, null);
}
public static ArticleDto of(Long id, UserAccountDto userAccountDto, String title, String content, String hashtag, LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy) {
return new ArticleDto(id, userAccountDto, title, content, hashtag, createdAt, createdBy, modifiedAt, modifiedBy);
public static ArticleDto of(Long id, UserAccountDto userAccountDto, String title, String content, Set<HashtagDto> hashtagDtos, LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy) {
return new ArticleDto(id, userAccountDto, title, content, hashtagDtos, createdAt, createdBy, modifiedAt, modifiedBy);
}
public static ArticleDto from(Article entity) {
@@ -31,7 +33,9 @@ public record ArticleDto(
UserAccountDto.from(entity.getUserAccount()),
entity.getTitle(),
entity.getContent(),
entity.getHashtag(),
entity.getHashtags().stream()
.map(HashtagDto::from)
.collect(Collectors.toUnmodifiableSet()),
entity.getCreatedAt(),
entity.getCreatedBy(),
entity.getModifiedAt(),
@@ -43,8 +47,7 @@ public record ArticleDto(
return Article.of(
userAccount,
title,
content,
hashtag
content
);
}

View File

@@ -1,6 +1,7 @@
package com.example.board.dto;
import com.example.board.domain.Article;
import com.example.board.domain.Hashtag;
import java.time.LocalDateTime;
import java.util.LinkedHashSet;
@@ -13,14 +14,14 @@ public record ArticleWithCommentsDto(
Set<ArticleCommentDto> articleCommentDtos,
String title,
String content,
String hashtag,
Set<HashtagDto> hashtagDtos,
LocalDateTime createdAt,
String createdBy,
LocalDateTime modifiedAt,
String modifiedBy
) {
public static ArticleWithCommentsDto of(Long id, UserAccountDto userAccountDto, Set<ArticleCommentDto> articleCommentDtos, String title, String content, String hashtag, LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy) {
return new ArticleWithCommentsDto(id, userAccountDto, articleCommentDtos, title, content, hashtag, createdAt, createdBy, modifiedAt, modifiedBy);
public static ArticleWithCommentsDto of(Long id, UserAccountDto userAccountDto, Set<ArticleCommentDto> articleCommentDtos, String title, String content, Set<HashtagDto> hashtagDtos, LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy) {
return new ArticleWithCommentsDto(id, userAccountDto, articleCommentDtos, title, content, hashtagDtos, createdAt, createdBy, modifiedAt, modifiedBy);
}
public static ArticleWithCommentsDto from(Article entity) {
@@ -32,7 +33,9 @@ public record ArticleWithCommentsDto(
.collect(Collectors.toCollection(LinkedHashSet::new)),
entity.getTitle(),
entity.getContent(),
entity.getHashtag(),
entity.getHashtags().stream()
.map(HashtagDto::from)
.collect(Collectors.toUnmodifiableSet()),
entity.getCreatedAt(),
entity.getCreatedBy(),
entity.getModifiedAt(),

View File

@@ -0,0 +1,39 @@
package com.example.board.dto;
import com.example.board.domain.Hashtag;
import java.time.LocalDateTime;
public record HashtagDto(
Long id,
String hashtagName,
LocalDateTime createdAt,
String createdBy,
LocalDateTime modifiedAt,
String modifiedBy
) {
public static HashtagDto of(String hashtagName) {
return new HashtagDto(null, hashtagName, null, null, null, null);
}
public static HashtagDto of(Long id, String hashtagName, LocalDateTime createdAt, String createdBy, LocalDateTime modifiedAt, String modifiedBy) {
return new HashtagDto(id, hashtagName, createdAt, createdBy, modifiedAt, modifiedBy);
}
public static HashtagDto from(Hashtag entity) {
return new HashtagDto(
entity.getId(),
entity.getHashtagName(),
entity.getCreatedAt(),
entity.getCreatedBy(),
entity.getModifiedAt(),
entity.getModifiedBy()
);
}
public Hashtag toEntity() {
return Hashtag.of(hashtagName);
}
}

View File

@@ -0,0 +1,16 @@
package com.example.board.dto;
import java.time.LocalDateTime;
import java.util.Set;
public record HashtagWithArticlesDto(
Long id,
Set<ArticleDto> articles,
String hashtagName,
LocalDateTime createdAt,
String createdBy,
LocalDateTime modifiedAt,
String modifiedBy
) {
}

View File

@@ -1,24 +1,30 @@
package com.example.board.dto.request;
import com.example.board.dto.ArticleDto;
import com.example.board.dto.HashtagDto;
import com.example.board.dto.UserAccountDto;
import java.util.Set;
public record ArticleRequest(
String title,
String content,
String hashtag
String content
) {
public static ArticleRequest of(String title, String content, String hashtag) {
return new ArticleRequest(title, content, hashtag);
public static ArticleRequest of(String title, String content) {
return new ArticleRequest(title, content);
}
public ArticleDto toDto(UserAccountDto userAccountDto) {
return toDto(userAccountDto, null);
}
public ArticleDto toDto(UserAccountDto userAccountDto, Set<HashtagDto> hashtagDtos) {
return ArticleDto.of(
userAccountDto,
title,
content,
hashtag
hashtagDtos
);
}

View File

@@ -1,22 +1,25 @@
package com.example.board.dto.response;
import com.example.board.dto.ArticleDto;
import com.example.board.dto.HashtagDto;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.stream.Collectors;
public record ArticleResponse(
Long id,
String title,
String content,
String hashtag,
Set<String> hashtags,
LocalDateTime createdAt,
String email,
String nickname
) implements Serializable {
public static ArticleResponse of(Long id, String title, String content, String hashtag, LocalDateTime createdAt, String email, String nickname) {
return new ArticleResponse(id, title, content, hashtag, createdAt, email, nickname);
public static ArticleResponse of(Long id, String title, String content, Set<String> hashtags, LocalDateTime createdAt, String email, String nickname) {
return new ArticleResponse(id, title, content, hashtags, createdAt, email, nickname);
}
public static ArticleResponse from(ArticleDto dto) {
@@ -29,7 +32,9 @@ public record ArticleResponse(
dto.id(),
dto.title(),
dto.content(),
dto.hashtag(),
dto.hashtagDtos().stream()
.map(HashtagDto::hashtagName)
.collect(Collectors.toUnmodifiableSet()),
dto.createdAt(),
dto.userAccountDto().email(),
nickname

View File

@@ -1,6 +1,7 @@
package com.example.board.dto.response;
import com.example.board.dto.ArticleWithCommentsDto;
import com.example.board.dto.HashtagDto;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -12,7 +13,7 @@ public record ArticleWithCommentsResponse(
Long id,
String title,
String content,
String hashtag,
Set<String> hashtags,
LocalDateTime createdAt,
String email,
String nickname,
@@ -20,8 +21,8 @@ public record ArticleWithCommentsResponse(
Set<ArticleCommentResponse> articleCommentsResponse
) implements Serializable {
public static ArticleWithCommentsResponse of(Long id, String title, String content, String hashtag, LocalDateTime createdAt, String email, String nickname, String userId, Set<ArticleCommentResponse> articleCommentResponses) {
return new ArticleWithCommentsResponse(id, title, content, hashtag, createdAt, email, nickname, userId, articleCommentResponses);
public static ArticleWithCommentsResponse of(Long id, String title, String content, Set<String> hashtags, LocalDateTime createdAt, String email, String nickname, String userId, Set<ArticleCommentResponse> articleCommentResponses) {
return new ArticleWithCommentsResponse(id, title, content, hashtags, createdAt, email, nickname, userId, articleCommentResponses);
}
public static ArticleWithCommentsResponse from(ArticleWithCommentsDto dto) {
@@ -34,7 +35,9 @@ public record ArticleWithCommentsResponse(
dto.id(),
dto.title(),
dto.content(),
dto.hashtag(),
dto.hashtagDtos().stream()
.map(HashtagDto::hashtagName)
.collect(Collectors.toUnmodifiableSet()),
dto.createdAt(),
dto.userAccountDto().email(),
nickname,

View File

@@ -18,26 +18,24 @@ public interface ArticleRepository extends
JpaRepository<Article, Long>,
ArticleRepositoryCustom,
QuerydslPredicateExecutor<Article>,
QuerydslBinderCustomizer<QArticle>
{
QuerydslBinderCustomizer<QArticle> {
Page<Article> findByTitleContaining(String title, Pageable pageable);
Page<Article> findByContentContaining(String content, Pageable pageable);
Page<Article> findByUserAccount_UserIdContaining(String userId, Pageable pageable);
Page<Article> findByUserAccount_NicknameContaining(String nickname, Pageable pageable);
Page<Article> findByHashtag(String hashtag, Pageable pageable);
void deleteByIdAndUserAccount_UserId(Long articleId, String userId);
void deleteByIdAndUserAccount_UserId(Long articleId, String userid);
@Override
default void customize(QuerydslBindings bindings, QArticle root) {
bindings.excludeUnlistedProperties(true);
bindings.including(root.title, root.content, root.hashtag, root.createdAt, root.createdBy);
// bindings.bind(root.title).first(StringExpression::likeIgnoreCase); // like '${v}'
bindings.bind(root.title).first(StringExpression::containsIgnoreCase); // like '%${v}%'
bindings.bind(root.content ).first(StringExpression::containsIgnoreCase);
bindings.bind(root.hashtag).first(StringExpression::containsIgnoreCase);
bindings.including(root.title, root.content, root.hashtags, root.createdAt, root.createdBy);
bindings.bind(root.title).first(StringExpression::containsIgnoreCase);
bindings.bind(root.content).first(StringExpression::containsIgnoreCase);
bindings.bind(root.hashtags.any().hashtagName).first(StringExpression::containsIgnoreCase);
bindings.bind(root.createdAt).first(DateTimeExpression::eq);
bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
}
}

View File

@@ -0,0 +1,20 @@
package com.example.board.repository;
import com.example.board.domain.Hashtag;
import com.example.board.repository.querydsl.HashtagRepositoryCustom;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@RepositoryRestResource
public interface HashtagRepository extends
JpaRepository<Hashtag, Long>,
HashtagRepositoryCustom,
QuerydslPredicateExecutor<Hashtag> {
Optional<Hashtag> findByHashtagName(String hashtagName);
List<Hashtag> findByHashtagNameIn(Set<String> hashtagNames);
}

View File

@@ -1,8 +1,19 @@
package com.example.board.repository.querydsl;
import com.example.board.domain.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.Collection;
import java.util.List;
public interface ArticleRepositoryCustom {
/**
* @deprecated 해시태그 도메인을 새로 만들었으므로 이 코드는 더 이상 사용할 필요 없다.
* @see HashtagRepositoryCustom#findAllHashtagNames()
*/
@Deprecated
List<String> findAllDistinctHashtags();
Page<Article> findByHashtagNames(Collection<String> hashtagNames, Pageable pageable);
}

View File

@@ -2,8 +2,14 @@ package com.example.board.repository.querydsl;
import com.example.board.domain.Article;
import com.example.board.domain.QArticle;
import com.example.board.domain.QHashtag;
import com.querydsl.jpa.JPQLQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import java.util.Collection;
import java.util.List;
public class ArticleRepositoryCustomImpl extends QuerydslRepositorySupport implements ArticleRepositoryCustom {
@@ -18,8 +24,21 @@ public class ArticleRepositoryCustomImpl extends QuerydslRepositorySupport imple
return from(article)
.distinct()
.select(article.hashtag)
.where(article.hashtag.isNotNull())
.select(article.hashtags.any().hashtagName)
.fetch();
}
}
@Override
public Page<Article> findByHashtagNames(Collection<String> hashtagNames, Pageable pageable) {
QHashtag hashtag = QHashtag.hashtag;
QArticle article = QArticle.article;
JPQLQuery<Article> query = from(article)
.innerJoin(article.hashtags, hashtag)
.where(hashtag.hashtagName.in(hashtagNames));
List<Article> articles = getQuerydsl().applyPagination(pageable, query).fetch();
return new PageImpl<>(articles, pageable, query.fetchCount());
}
}

View File

@@ -0,0 +1,7 @@
package com.example.board.repository.querydsl;
import java.util.List;
public interface HashtagRepositoryCustom {
List<String> findAllHashtagNames();
}

View File

@@ -0,0 +1,24 @@
package com.example.board.repository.querydsl;
import com.example.board.domain.Hashtag;
import com.example.board.domain.QHashtag;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import java.util.List;
public class HashtagRepositoryCustomImpl extends QuerydslRepositorySupport implements HashtagRepositoryCustom {
public HashtagRepositoryCustomImpl() {
super(Hashtag.class);
}
@Override
public List<String> findAllHashtagNames() {
QHashtag hashtag = QHashtag.hashtag;
return from(hashtag)
.select(hashtag.hashtagName)
.fetch();
}
}

View File

@@ -15,6 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityNotFoundException;
import java.util.Arrays;
import java.util.List;
@Slf4j
@@ -37,7 +38,11 @@ public class ArticleService {
case CONTENT -> articleRepository.findByContentContaining(searchKeyword, pageable).map(ArticleDto::from);
case ID -> articleRepository.findByUserAccount_UserIdContaining(searchKeyword, pageable).map(ArticleDto::from);
case NICKNAME -> articleRepository.findByUserAccount_NicknameContaining(searchKeyword, pageable).map(ArticleDto::from);
case HASHTAG -> articleRepository.findByHashtag("#" + searchKeyword, pageable).map(ArticleDto::from);
case HASHTAG -> articleRepository.findByHashtagNames(
Arrays.stream(searchKeyword.split(" ")).toList(),
pageable
)
.map(ArticleDto::from);
};
}
@@ -68,9 +73,7 @@ public class ArticleService {
if (article.getUserAccount().equals(userAccount)) {
if (dto.title() != null) { article.setTitle(dto.title()); }
if (dto.content() != null) { article.setContent(dto.content()); }
article.setHashtag(dto.hashtag());
}
} catch (EntityNotFoundException e) {
log.warn("게시글 업데이트 실패. 게시글을 수정하는데 필요한 정보를 찾을 수 없습니다 - {}", e.getLocalizedMessage());
}
@@ -80,19 +83,21 @@ public class ArticleService {
articleRepository.deleteByIdAndUserAccount_UserId(articleId, userId);
}
public long getArticleCount() {
return articleRepository.count();
}
@Transactional(readOnly = true)
public Page<ArticleDto> searchArticlesViaHashtag(String hashtag, Pageable pageable) {
if (hashtag == null || hashtag.isBlank()) {
return Page.empty(pageable);
}
return articleRepository.findByHashtag(hashtag, pageable).map(ArticleDto::from);
return articleRepository.findByHashtagNames(null, pageable).map(ArticleDto::from);
}
public List<String> getHashtags() {
return articleRepository.findAllDistinctHashtags();
}
public long getArticleCount() {
return articleRepository.count();
}
}

View File

@@ -0,0 +1,19 @@
package com.example.board.service;
import org.springframework.stereotype.Service;
import java.util.Set;
@Service
public class HashtagService {
public Object parseHashtagNames(String content) {
return null;
}
public Object findHashtagsByNames(Set<String> expectedHashtagNames) {
return null;
}
public void deleteHashtagWithoutArticles(Object any) {
}
}

View File

@@ -1,264 +1,579 @@
-- 테스트 계정
-- TODO: 테스트용이지만 비밀번호가 노출된 데이터 세팅. 개선하는 것이 좋을 지 고민해 보자.
insert into user_account (user_id, user_password, nickname, email, memo, created_at, created_by, modified_at, modified_by) values
('bobby', '{noop}1234', 'bobby', 'bobby@mail.com', 'I am bobby.', now(), 'bobby', now(), 'bobby')
('bobby', '{noop}asdf1234', 'bobby', 'bobby@mail.com', 'I am bobby.', now(), 'bobby', now(), 'bobby')
;
insert into user_account (user_id, user_password, nickname, email, memo, created_at, created_by, modified_at, modified_by) values
('bobby2', '{noop}1234', 'bobby2', 'bobby2@mail.com', 'I am bobby2.', now(), 'bobby2', now(), 'bobby2')
('bobby2', '{noop}asdf1234', 'bobby2', 'bobby2@mail.com', 'I am bobby2.', now(), 'bobby2', now(), 'bobby2')
;
-- 123 게시글
insert into article (user_id, title, content, hashtag, created_by, modified_by, created_at, modified_at) values
insert into article (user_id, title, content, created_by, modified_by, created_at, modified_at) values
('bobby2', 'Quisque ut erat.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.', '#pink', 'Kamilah', 'Murial', '2021-05-30 23:53:46', '2021-03-10 08:48:50'),
('bobby2', 'Morbi ut odio.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.
Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', '#purple', 'Arv', 'Keelby', '2021-05-06 11:51:24', '2021-05-23 08:34:54'),
('bobby2', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.', '#purple', 'Adams', 'Thalia', '2021-08-13 08:32:22', '2021-04-02 02:58:19'),
('bobby', 'Fusce posuere felis sed lacus.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', '#mauv', 'Johny', 'Constantin', '2021-09-05 04:28:16', '2021-10-31 17:46:08'),
('bobby', 'Aliquam erat volutpat.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.', '#green', 'Karlene', 'Marmaduke', '2022-01-25 16:10:23', '2021-11-08 08:47:03'),
('bobby', 'Donec ut mauris eget massa tempor convallis.', 'Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#maroon', 'Alonso', 'Eustacia', '2022-01-26 06:33:42', '2021-12-08 11:27:30'),
('bobby', 'Nullam molestie nibh in lectus.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', '#orange', 'Dedra', 'Wilek', '2021-05-04 19:51:29', '2021-10-09 16:52:09'),
('bobby', 'Sed ante.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.', '#teal', 'Doe', 'Jodi', '2021-10-23 23:45:21', '2021-08-05 14:19:36'),
('bobby', 'In hac habitasse platea dictumst.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.', '#khaki', 'Fitz', 'Jemmie', '2021-01-10 21:03:03', '2021-04-15 05:02:39'),
('bobby', 'Vivamus in felis eu sapien cursus vestibulum.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#puce', 'Grace', 'Bryn', '2021-09-28 07:01:29', '2021-09-01 13:54:55'),
('bobby', 'Morbi a ipsum.', 'Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.', '#orange', 'Lalo', 'Lorrie', '2022-01-26 03:40:15', '2021-07-18 05:30:34'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.', '#purple', 'Jane', 'Tresa', '2021-07-22 22:25:07', '2021-05-16 14:20:27'),
('bobby', 'Duis at velit eu est congue elementum.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.', '#maroon', 'Cookie', 'Rosalia', '2021-02-20 10:06:13', '2021-10-10 06:05:30'),
('bobby', 'In hac habitasse platea dictumst.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', null, 'Gerti', 'Everard', '2021-08-17 15:14:51', '2021-10-01 13:01:41'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', '#khaki', 'Adolf', 'Tiff', '2021-12-03 03:44:00', '2021-07-12 00:20:12'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.', null, 'Vivyanne', 'Humbert', '2021-08-11 04:04:05', '2021-09-05 17:15:51'),
('bobby', 'Donec semper sapien a libero.', 'Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.', null, 'Ki', 'Ophelia', '2021-12-21 13:27:54', '2021-05-07 08:06:52'),
('bobby', 'Quisque id justo sit amet sapien dignissim vestibulum.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.', '#goldenrod', 'Jackelyn', 'Vlad', '2021-06-29 13:00:35', '2021-05-11 00:47:43'),
('bobby', 'Morbi quis tortor id nulla ultrices aliquet.', 'Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.', '#yellow', 'Jesus', 'Peri', '2021-06-18 20:56:37', '2021-07-05 18:44:15'),
('bobby', 'In sagittis dui vel nisl.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', '#orange', 'Abbot', 'Carolann', '2021-06-16 12:20:50', '2021-01-26 02:34:46'),
('bobby', 'Integer non velit.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
Phasellus in felis. Donec semper sapien a libero. Nam dui.', '#fuscia', 'Shae', 'Rhody', '2021-01-14 23:22:59', '2022-01-31 12:02:00'),
('bobby', 'Quisque id justo sit amet sapien dignissim vestibulum.', 'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.
Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.', '#puce', 'Dominik', 'Enos', '2021-12-17 17:42:09', '2021-06-28 19:55:49'),
('bobby', 'Nullam varius.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', null, 'Sheila-kathryn', 'Lil', '2021-06-11 13:47:12', '2021-11-30 13:45:21'),
('bobby', 'Sed ante.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', '#teal', 'Moina', 'Coletta', '2021-09-01 00:39:21', '2021-06-20 13:09:41'),
('bobby', 'Morbi non lectus.', 'Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.
Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.', '#fuscia', 'Niel', 'Alexio', '2021-04-13 02:59:34', '2021-01-26 00:43:20'),
('bobby', 'Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.', '#maroon', 'Gannie', 'Alicea', '2021-05-18 21:27:32', '2021-04-26 23:42:00'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.', '#teal', 'Burg', 'Saudra', '2022-01-09 16:49:14', '2021-01-30 05:24:22'),
('bobby', 'Nulla justo.', 'Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.
Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.', '#turquoise', 'Monah', 'Alexandro', '2021-08-25 08:42:32', '2021-06-24 17:50:44'),
('bobby', 'Pellentesque viverra pede ac diam.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', '#fuscia', 'Tadeas', 'Lynnelle', '2021-04-16 16:05:00', '2021-11-18 17:42:45'),
('bobby', 'Curabitur gravida nisi at nibh.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', null, 'Clim', 'Carin', '2021-11-14 22:48:52', '2021-01-15 04:11:23'),
('bobby', 'Duis aliquam convallis nunc.', 'Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.', '#blue', 'Vonnie', 'Amery', '2021-07-07 06:30:56', '2021-06-21 07:33:19'),
('bobby', 'Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', '#yellow', 'Billi', 'Laure', '2021-10-22 11:07:01', '2022-01-24 21:15:02'),
('bobby', 'Donec semper sapien a libero.', 'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.', '#pink', 'Terese', 'Dalli', '2021-07-04 02:06:12', '2021-10-27 03:27:56'),
('bobby', 'Phasellus in felis.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.', '#goldenrod', 'Arlen', 'Francoise', '2021-03-06 10:32:19', '2021-09-16 12:49:52'),
('bobby', 'Etiam vel augue.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.', '#blue', 'Roderich', 'Daphna', '2021-07-29 05:37:58', '2021-09-09 14:57:16'),
('bobby', 'In hac habitasse platea dictumst.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.', null, 'Jeremy', 'Allx', '2021-03-29 02:31:37', '2021-10-04 04:51:02'),
('bobby', 'Nunc purus.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.', '#purple', 'Neely', 'Hubey', '2021-12-09 23:08:51', '2022-01-19 22:52:00'),
('bobby', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa.', 'Fusce consequat. Nulla nisl. Nunc nisl.
Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.', '#green', 'Kasper', 'Nealy', '2021-01-06 11:57:12', '2021-09-22 23:51:12'),
('bobby', 'Curabitur at ipsum ac tellus semper interdum.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', null, 'Herminia', 'Alexandra', '2022-01-24 16:01:31', '2021-09-04 09:45:28'),
('bobby', 'Morbi non lectus.', 'Proin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.
Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.', '#turquoise', 'Dionne', 'Arvy', '2021-04-07 19:45:14', '2021-05-04 04:31:17'),
('bobby', 'Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.', 'Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', null, 'Armin', 'Hetti', '2021-12-13 04:47:57', '2021-11-21 10:40:03'),
('bobby', 'Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.', '#fuscia', 'Eamon', 'Alberta', '2021-01-14 18:42:07', '2021-08-08 01:49:02'),
('bobby', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.', '#violet', 'Udale', 'Steffane', '2021-01-09 05:17:28', '2022-01-07 13:29:29'),
('bobby', 'Ut tellus.', 'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.
Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.', null, 'Jackie', 'Emelda', '2021-11-20 09:06:53', '2021-06-29 21:11:43'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.', '#red', 'Judye', 'Hulda', '2022-01-31 02:12:17', '2021-11-13 04:25:33'),
('bobby', 'Donec quis orci eget orci vehicula condimentum.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.', null, 'Hana', 'Anabel', '2021-05-19 15:38:50', '2021-09-18 12:45:53'),
('bobby', 'Pellentesque eget nunc.', 'Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.', '#purple', 'Gil', 'Gerri', '2021-07-13 02:04:06', '2021-04-28 03:43:55'),
('bobby', 'Nam dui.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.', '#crimson', 'Peyton', 'Leena', '2021-01-09 14:46:57', '2021-10-20 07:05:55'),
('bobby', 'Morbi a ipsum.', 'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.', '#indigo', 'Pepillo', 'Bride', '2021-07-23 15:14:41', '2021-07-29 20:10:02'),
('bobby', 'Aenean auctor gravida sem.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.', '#khaki', 'Tull', 'Tracee', '2021-03-01 23:36:57', '2021-04-20 05:54:22'),
('bobby', 'Morbi quis tortor id nulla ultrices aliquet.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', null, 'Gregorius', 'Marlane', '2021-08-16 16:20:12', '2021-09-28 15:21:22'),
('bobby', 'Nulla nisl.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.', '#turquoise', 'Cindi', 'Cary', '2021-09-29 02:56:11', '2021-04-26 00:16:31'),
('bobby', 'Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc.', 'Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', null, 'Rachel', 'Maurise', '2021-11-05 23:17:06', '2021-06-02 11:12:17'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.', '#pink', 'Muriel', 'Ki', '2021-06-29 18:05:20', '2021-11-14 19:30:51'),
('bobby', 'Phasellus in felis.', 'Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', '#orange', 'Emanuele', 'Frank', '2021-01-13 10:45:47', '2022-01-07 02:08:42'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', null, 'Arlen', 'Kelley', '2021-01-18 04:14:36', '2021-01-12 15:49:40'),
('bobby', 'Nunc nisl.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.', '#orange', 'Brant', 'Rycca', '2021-10-24 18:34:37', '2021-09-24 11:55:07'),
('bobby', 'Nulla justo.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.', '#pink', 'Glenn', 'Isaiah', '2021-12-27 21:37:13', '2021-06-21 11:23:36'),
('bobby', 'Praesent lectus.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#crimson', 'Doro', 'Adah', '2021-04-15 20:39:03', '2021-07-29 20:08:20'),
('bobby', 'Etiam pretium iaculis justo.', 'Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', '#crimson', 'Coletta', 'Magdalene', '2021-11-14 13:15:09', '2021-10-13 16:51:20'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
Sed ante. Vivamus tortor. Duis mattis egestas metus.', '#teal', 'Miltie', 'Krissy', '2021-11-29 14:30:18', '2021-06-28 06:23:31'),
('bobby', 'Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue.', 'Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.
Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', null, 'Alvan', 'Stu', '2021-02-07 15:13:30', '2021-03-20 08:42:35'),
('bobby', 'Maecenas tincidunt lacus at velit.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.', '#violet', 'Lurleen', 'Sly', '2021-10-12 02:16:28', '2021-03-28 22:35:10'),
('bobby', 'Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', 'Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.', '#violet', 'Gus', 'Roy', '2021-04-30 18:14:12', '2021-08-07 12:28:47'),
('bobby', 'Nulla facilisi.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', '#violet', 'Alfons', 'Meredith', '2021-11-30 09:26:07', '2021-05-25 03:28:14'),
('bobby', 'Nunc nisl.', 'Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.', '#turquoise', 'Alaine', 'Kaile', '2021-05-19 04:01:38', '2022-01-20 20:21:15'),
('bobby', 'Praesent blandit lacinia erat.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
Sed ante. Vivamus tortor. Duis mattis egestas metus.', '#puce', 'Bancroft', 'Brittne', '2021-11-07 20:25:38', '2021-07-15 23:44:30'),
('bobby', 'Quisque porta volutpat erat.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#fuscia', 'Sibyl', 'Felicia', '2021-07-23 03:14:59', '2021-09-23 12:59:16'),
('bobby', 'In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', null, 'Nikos', 'Brooks', '2021-05-26 23:29:09', '2021-10-30 22:20:34'),
('bobby', 'Proin eu mi.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.', '#puce', 'Christa', 'Avrom', '2021-01-03 15:19:52', '2021-07-26 09:56:42'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#pink', 'Kassey', 'Abbi', '2021-10-23 18:21:35', '2021-08-12 08:13:10'),
('bobby', 'Fusce posuere felis sed lacus.', 'Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.', '#fuscia', 'Thebault', 'Adi', '2021-04-23 16:56:09', '2022-01-14 06:35:51'),
('bobby', 'Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.', 'Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
#pink', 'Kamilah', 'Murial', '2021-05-30 23:53:46', '2021-03-10 08:48:50'),
('bobby2', 'Morbi ut odio.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.
Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
#purple', 'Arv', 'Keelby', '2021-05-06 11:51:24', '2021-05-23 08:34:54'),
('bobby2', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
#purple', 'Adams', 'Thalia', '2021-08-13 08:32:22', '2021-04-02 02:58:19'),
('bobby', 'Fusce posuere felis sed lacus.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
#mauv', 'Johny', 'Constantin', '2021-09-05 04:28:16', '2021-10-31 17:46:08'),
('bobby', 'Aliquam erat volutpat.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
#green', 'Karlene', 'Marmaduke', '2022-01-25 16:10:23', '2021-11-08 08:47:03'),
('bobby', 'Donec ut mauris eget massa tempor convallis.', 'Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
Phasellus in felis. Donec semper sapien a libero. Nam dui.', '#red', 'Claire', 'Alyson', '2021-06-05 04:03:52', '2021-04-21 16:51:40'),
('bobby', 'Proin eu mi.', 'Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', null, 'Rodrick', 'Judd', '2021-09-15 04:12:40', '2021-07-16 08:11:59'),
('bobby', 'Cras in purus eu magna vulputate luctus.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.', '#turquoise', 'Heidi', 'Madlen', '2021-09-28 19:02:55', '2021-07-10 16:49:00'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', '#blue', 'Yasmeen', 'Edie', '2021-12-29 02:35:31', '2021-09-28 00:32:13'),
('bobby', 'Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.', '#pink', 'Abbot', 'Nicoline', '2022-01-30 03:12:36', '2021-06-05 04:08:51'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.', null, 'Guthry', 'Darla', '2021-05-17 21:21:38', '2021-12-25 10:06:03'),
('bobby', 'Maecenas rhoncus aliquam lacus.', 'Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.', null, 'Andris', 'Leigh', '2021-02-16 03:49:50', '2021-01-23 08:55:39'),
('bobby', 'Vestibulum ac est lacinia nisi venenatis tristique.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', '#purple', 'Alika', 'Egbert', '2021-03-25 21:56:32', '2021-08-06 09:25:55'),
('bobby', 'In congue.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', '#violet', 'Rosaleen', 'Laurel', '2021-05-31 02:31:10', '2021-05-25 07:40:17'),
('bobby', 'Nam tristique tortor eu pede.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.', '#turquoise', 'Rosie', 'Jeddy', '2021-04-21 13:04:12', '2021-12-21 21:27:10'),
('bobby', 'In sagittis dui vel nisl.', 'Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.', '#purple', 'Hermann', 'Dynah', '2021-08-11 15:17:07', '2021-07-26 14:59:15'),
('bobby', 'Ut tellus.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
#maroon', 'Alonso', 'Eustacia', '2022-01-26 06:33:42', '2021-12-08 11:27:30'),
('bobby', 'Nullam molestie nibh in lectus.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
#orange', 'Dedra', 'Wilek', '2021-05-04 19:51:29', '2021-10-09 16:52:09'),
('bobby', 'Sed ante.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.', '#crimson', 'Blanch', 'Florinda', '2021-04-07 02:11:09', '2021-03-11 07:18:08'),
('bobby', 'Pellentesque at nulla.', 'Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', '#teal', 'Gleda', 'Ellary', '2021-02-09 04:55:31', '2021-06-03 13:44:00'),
('bobby', 'Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.', '#red', 'Joete', 'Tedmund', '2021-02-24 21:47:59', '2021-03-26 22:36:33'),
('bobby', 'Suspendisse potenti.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.', null, 'Jamie', 'Alexa', '2021-08-06 04:32:39', '2021-02-19 12:04:36'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.', '#violet', 'Doris', 'Mendel', '2021-09-17 11:09:35', '2021-05-08 09:41:26'),
('bobby', 'Nulla ac enim.', 'Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', null, 'Bartie', 'Tess', '2021-11-23 16:40:31', '2021-02-14 18:25:25'),
('bobby', 'Morbi ut odio.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.', '#khaki', 'Sile', 'Bertram', '2021-07-05 03:55:44', '2021-04-26 06:11:20'),
('bobby', 'Proin interdum mauris non ligula pellentesque ultrices.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.', '#orange', 'Stillman', 'Robinett', '2021-01-28 08:36:31', '2022-01-22 04:26:21'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', '#purple', 'Teresa', 'Geordie', '2021-10-01 23:56:53', '2021-03-14 14:48:32'),
('bobby', 'Vivamus in felis eu sapien cursus vestibulum.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', '#turquoise', 'Silvie', 'Ely', '2021-06-25 15:27:52', '2021-07-11 22:35:10'),
('bobby', 'Sed ante.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.', '#turquoise', 'Marline', 'Avigdor', '2021-10-28 11:05:02', '2022-01-01 22:59:45'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.', '#fuscia', 'Bella', 'Redd', '2021-07-25 10:58:10', '2022-01-03 06:44:01'),
('bobby', 'Donec ut mauris eget massa tempor convallis.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.', '#maroon', 'Rubie', 'Gallard', '2021-04-17 00:00:13', '2021-01-01 16:09:42'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.', '#yellow', 'Meghan', 'Bone', '2021-10-01 06:58:34', '2021-08-06 07:47:53'),
('bobby', 'Integer non velit.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', '#orange', 'Meris', 'Griffin', '2021-04-19 01:54:16', '2021-04-23 08:04:24'),
('bobby', 'Donec dapibus.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.', '#violet', 'Amy', 'Tann', '2021-05-06 13:30:44', '2021-12-04 03:54:16'),
('bobby', 'Duis at velit eu est congue elementum.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', '#crimson', 'Colan', 'Anthe', '2021-11-27 23:07:19', '2021-04-21 19:58:19'),
('bobby', 'Etiam justo.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.', null, 'Honor', 'Fayina', '2021-05-14 16:02:48', '2022-01-07 21:17:52'),
('bobby', 'Pellentesque eget nunc.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
#teal', 'Doe', 'Jodi', '2021-10-23 23:45:21', '2021-08-05 14:19:36'),
('bobby', 'In hac habitasse platea dictumst.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', '#puce', 'Brooke', 'Demetris', '2021-11-14 19:35:48', '2021-09-27 23:55:31'),
('bobby', 'Curabitur gravida nisi at nibh.', 'Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.', '#red', 'Regina', 'Son', '2021-09-05 08:18:57', '2021-08-29 18:59:01'),
('bobby', 'Sed sagittis.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.', '#khaki', 'Matelda', 'Alla', '2021-09-08 21:13:52', '2021-07-02 08:49:38'),
('bobby', 'Morbi porttitor lorem id ligula.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.', '#turquoise', 'Brock', 'Ludwig', '2021-06-26 11:28:38', '2021-07-24 17:24:01'),
('bobby', 'Fusce consequat.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#red', 'Kat', 'Zelig', '2021-09-24 11:37:56', '2021-07-12 13:57:43'),
('bobby', 'Maecenas ut massa quis augue luctus tincidunt.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
#khaki', 'Fitz', 'Jemmie', '2021-01-10 21:03:03', '2021-04-15 05:02:39'),
('bobby', 'Vivamus in felis eu sapien cursus vestibulum.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#blue', 'Thaddus', 'Merna', '2021-05-23 13:06:03', '2021-03-24 08:32:10'),
('bobby', 'Pellentesque viverra pede ac diam.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', null, 'Ronnie', 'Brittaney', '2021-12-26 19:23:32', '2021-09-05 19:27:21'),
('bobby', 'In quis justo.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', null, 'Byron', 'Randy', '2021-08-18 13:40:37', '2021-12-28 08:34:19'),
('bobby', 'Fusce consequat.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', null, 'Neron', 'Christa', '2021-05-24 18:32:45', '2021-01-01 16:15:57'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.', '#yellow', 'Merilee', 'Dolli', '2021-04-20 00:10:42', '2021-03-27 16:42:26'),
('bobby', 'Proin at turpis a pede posuere nonummy.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.', '#indigo', 'Caron', 'Valle', '2021-11-23 23:38:55', '2021-03-23 16:50:35'),
('bobby', 'Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.', '#mauv', 'Delbert', 'Cammy', '2021-06-03 08:38:23', '2021-07-16 21:36:19'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est.', 'Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.
Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.', '#crimson', 'Konstantin', 'Sarine', '2021-12-21 13:46:23', '2021-12-27 03:46:03'),
('bobby', 'Nunc purus.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', null, 'Krysta', 'Euphemia', '2021-05-03 23:53:27', '2021-04-16 15:39:57'),
('bobby', 'Etiam pretium iaculis justo.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.', '#turquoise', 'Oliver', 'Clint', '2021-06-12 07:00:00', '2021-06-14 11:33:22'),
('bobby', 'In quis justo.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', '#red', 'Vito', 'Bird', '2021-06-20 08:39:02', '2021-05-06 03:06:08'),
('bobby', 'In sagittis dui vel nisl.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', null, 'Errick', 'Shirlee', '2021-08-18 08:08:42', '2021-11-04 15:44:08'),
('bobby', 'Integer ac leo.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', '#puce', 'Benjamin', 'Arlie', '2021-11-23 02:21:46', '2021-02-13 07:35:14'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', '#yellow', 'Tessy', 'Nan', '2021-10-07 20:30:36', '2021-03-06 01:51:12'),
('bobby', 'Nulla justo.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.', null, 'Babette', 'Dudley', '2021-02-05 15:19:07', '2021-04-01 14:46:59'),
('bobby', 'Aenean lectus.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#puce', 'Grace', 'Bryn', '2021-09-28 07:01:29', '2021-09-01 13:54:55'),
('bobby', 'Morbi a ipsum.', 'Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
#orange', 'Lalo', 'Lorrie', '2022-01-26 03:40:15', '2021-07-18 05:30:34'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
#purple', 'Jane', 'Tresa', '2021-07-22 22:25:07', '2021-05-16 14:20:27'),
('bobby', 'Duis at velit eu est congue elementum.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
#maroon', 'Cookie', 'Rosalia', '2021-02-20 10:06:13', '2021-10-10 06:05:30'),
('bobby', 'In hac habitasse platea dictumst.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', 'Gerti', 'Everard', '2021-08-17 15:14:51', '2021-10-01 13:01:41'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', '#yellow', 'Hoyt', 'Austina', '2021-06-26 18:20:38', '2021-02-20 16:09:49'),
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
#khaki', 'Adolf', 'Tiff', '2021-12-03 03:44:00', '2021-07-12 00:20:12'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.', 'Vivyanne', 'Humbert', '2021-08-11 04:04:05', '2021-09-05 17:15:51'),
('bobby', 'Donec semper sapien a libero.', 'Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.', 'Ki', 'Ophelia', '2021-12-21 13:27:54', '2021-05-07 08:06:52'),
('bobby', 'Quisque id justo sit amet sapien dignissim vestibulum.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
#goldenrod', 'Jackelyn', 'Vlad', '2021-06-29 13:00:35', '2021-05-11 00:47:43'),
('bobby', 'Morbi quis tortor id nulla ultrices aliquet.', 'Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
#yellow', 'Jesus', 'Peri', '2021-06-18 20:56:37', '2021-07-05 18:44:15'),
('bobby', 'In sagittis dui vel nisl.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.
#orange', 'Abbot', 'Carolann', '2021-06-16 12:20:50', '2021-01-26 02:34:46'),
('bobby', 'Integer non velit.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
Phasellus in felis. Donec semper sapien a libero. Nam dui.
#fuscia', 'Shae', 'Rhody', '2021-01-14 23:22:59', '2022-01-31 12:02:00'),
('bobby', 'Quisque id justo sit amet sapien dignissim vestibulum.', 'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.
Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
#puce', 'Dominik', 'Enos', '2021-12-17 17:42:09', '2021-06-28 19:55:49'),
('bobby', 'Nullam varius.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', 'Sheila-kathryn', 'Lil', '2021-06-11 13:47:12', '2021-11-30 13:45:21'),
('bobby', 'Sed ante.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.
#teal', 'Moina', 'Coletta', '2021-09-01 00:39:21', '2021-06-20 13:09:41'),
('bobby', 'Morbi non lectus.', 'Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.
Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
#fuscia', 'Niel', 'Alexio', '2021-04-13 02:59:34', '2021-01-26 00:43:20'),
('bobby', 'Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
#maroon', 'Gannie', 'Alicea', '2021-05-18 21:27:32', '2021-04-26 23:42:00'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
#teal', 'Burg', 'Saudra', '2022-01-09 16:49:14', '2021-01-30 05:24:22'),
('bobby', 'Nulla justo.', 'Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.
Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
#turquoise', 'Monah', 'Alexandro', '2021-08-25 08:42:32', '2021-06-24 17:50:44'),
('bobby', 'Pellentesque viverra pede ac diam.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
#fuscia', 'Tadeas', 'Lynnelle', '2021-04-16 16:05:00', '2021-11-18 17:42:45'),
('bobby', 'Curabitur gravida nisi at nibh.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', 'Clim', 'Carin', '2021-11-14 22:48:52', '2021-01-15 04:11:23'),
('bobby', 'Duis aliquam convallis nunc.', 'Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
#blue', 'Vonnie', 'Amery', '2021-07-07 06:30:56', '2021-06-21 07:33:19'),
('bobby', 'Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
#yellow', 'Billi', 'Laure', '2021-10-22 11:07:01', '2022-01-24 21:15:02'),
('bobby', 'Donec semper sapien a libero.', 'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
#pink', 'Terese', 'Dalli', '2021-07-04 02:06:12', '2021-10-27 03:27:56'),
('bobby', 'Phasellus in felis.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
#goldenrod', 'Arlen', 'Francoise', '2021-03-06 10:32:19', '2021-09-16 12:49:52'),
('bobby', 'Etiam vel augue.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
#blue', 'Roderich', 'Daphna', '2021-07-29 05:37:58', '2021-09-09 14:57:16'),
('bobby', 'In hac habitasse platea dictumst.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.', 'Jeremy', 'Allx', '2021-03-29 02:31:37', '2021-10-04 04:51:02'),
('bobby', 'Nunc purus.', 'Proin leo odio, porttitor id, consequat in, consequat ut, nulla. Sed accumsan felis. Ut at dolor quis odio consequat varius.
#purple', 'Neely', 'Hubey', '2021-12-09 23:08:51', '2022-01-19 22:52:00'),
('bobby', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa.', 'Fusce consequat. Nulla nisl. Nunc nisl.
Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
#green', 'Kasper', 'Nealy', '2021-01-06 11:57:12', '2021-09-22 23:51:12'),
('bobby', 'Curabitur at ipsum ac tellus semper interdum.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.', 'Herminia', 'Alexandra', '2022-01-24 16:01:31', '2021-09-04 09:45:28'),
('bobby', 'Morbi non lectus.', 'Proin eu mi. Nulla ac enim. In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.
Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
#turquoise', 'Dionne', 'Arvy', '2021-04-07 19:45:14', '2021-05-04 04:31:17'),
('bobby', 'Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.', 'Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', 'Armin', 'Hetti', '2021-12-13 04:47:57', '2021-11-21 10:40:03'),
('bobby', 'Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
#fuscia', 'Eamon', 'Alberta', '2021-01-14 18:42:07', '2021-08-08 01:49:02'),
('bobby', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.
#violet', 'Udale', 'Steffane', '2021-01-09 05:17:28', '2022-01-07 13:29:29'),
('bobby', 'Ut tellus.', 'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.
Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.', 'Jackie', 'Emelda', '2021-11-20 09:06:53', '2021-06-29 21:11:43'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.
#red #white', 'Judye', 'Hulda', '2022-01-31 02:12:17', '2021-11-13 04:25:33'),
('bobby', 'Donec quis orci eget orci vehicula condimentum.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.', 'Hana', 'Anabel', '2021-05-19 15:38:50', '2021-09-18 12:45:53'),
('bobby', 'Pellentesque eget nunc.', 'Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
#purple', 'Gil', 'Gerri', '2021-07-13 02:04:06', '2021-04-28 03:43:55'),
('bobby', 'Nam dui.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.
#crimson', 'Peyton', 'Leena', '2021-01-09 14:46:57', '2021-10-20 07:05:55'),
('bobby', 'Morbi a ipsum.', 'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
#indigo', 'Pepillo', 'Bride', '2021-07-23 15:14:41', '2021-07-29 20:10:02'),
('bobby', 'Aenean auctor gravida sem.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
#khaki', 'Tull', 'Tracee', '2021-03-01 23:36:57', '2021-04-20 05:54:22'),
('bobby', 'Morbi quis tortor id nulla ultrices aliquet.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', 'Gregorius', 'Marlane', '2021-08-16 16:20:12', '2021-09-28 15:21:22'),
('bobby', 'Nulla nisl.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
#turquoise', 'Cindi', 'Cary', '2021-09-29 02:56:11', '2021-04-26 00:16:31'),
('bobby', 'Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc.', 'Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', 'Rachel', 'Maurise', '2021-11-05 23:17:06', '2021-06-02 11:12:17'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.
#pink', 'Muriel', 'Ki', '2021-06-29 18:05:20', '2021-11-14 19:30:51'),
('bobby', 'Phasellus in felis.', 'Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.
#orange', 'Emanuele', 'Frank', '2021-01-13 10:45:47', '2022-01-07 02:08:42'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', 'Arlen', 'Kelley', '2021-01-18 04:14:36', '2021-01-12 15:49:40'),
('bobby', 'Nunc nisl.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
#orange', 'Brant', 'Rycca', '2021-10-24 18:34:37', '2021-09-24 11:55:07'),
('bobby', 'Nulla justo.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.
#pink', 'Glenn', 'Isaiah', '2021-12-27 21:37:13', '2021-06-21 11:23:36'),
('bobby', 'Praesent lectus.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#crimson', 'Doro', 'Adah', '2021-04-15 20:39:03', '2021-07-29 20:08:20'),
('bobby', 'Etiam pretium iaculis justo.', 'Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.
#crimson', 'Coletta', 'Magdalene', '2021-11-14 13:15:09', '2021-10-13 16:51:20'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
Sed ante. Vivamus tortor. Duis mattis egestas metus.
#teal', 'Miltie', 'Krissy', '2021-11-29 14:30:18', '2021-06-28 06:23:31'),
('bobby', 'Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue.', 'Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.
Curabitur gravida nisi at nibh. In hac habitasse platea dictumst. Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem.
Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', 'Alvan', 'Stu', '2021-02-07 15:13:30', '2021-03-20 08:42:35'),
('bobby', 'Maecenas tincidunt lacus at velit.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
#violet', 'Lurleen', 'Sly', '2021-10-12 02:16:28', '2021-03-28 22:35:10'),
('bobby', 'Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', 'Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
#violet', 'Gus', 'Roy', '2021-04-30 18:14:12', '2021-08-07 12:28:47'),
('bobby', 'Nulla facilisi.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.
#violet', 'Alfons', 'Meredith', '2021-11-30 09:26:07', '2021-05-25 03:28:14'),
('bobby', 'Nunc nisl.', 'Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
Nullam sit amet turpis elementum ligula vehicula consequat. Morbi a ipsum. Integer a nibh.
#turquoise', 'Alaine', 'Kaile', '2021-05-19 04:01:38', '2022-01-20 20:21:15'),
('bobby', 'Praesent blandit lacinia erat.', 'In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
Sed ante. Vivamus tortor. Duis mattis egestas metus.
#puce', 'Bancroft', 'Brittne', '2021-11-07 20:25:38', '2021-07-15 23:44:30'),
('bobby', 'Quisque porta volutpat erat.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#fuscia', 'Sibyl', 'Felicia', '2021-07-23 03:14:59', '2021-09-23 12:59:16'),
('bobby', 'In tempor, turpis nec euismod scelerisque, quam turpis adipiscing lorem, vitae mattis nibh ligula nec sem.', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'Nikos', 'Brooks', '2021-05-26 23:29:09', '2021-10-30 22:20:34'),
('bobby', 'Proin eu mi.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
Maecenas ut massa quis augue luctus tincidunt. Nulla mollis molestie lorem. Quisque ut erat.
#puce', 'Christa', 'Avrom', '2021-01-03 15:19:52', '2021-07-26 09:56:42'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#pink', 'Kassey', 'Abbi', '2021-10-23 18:21:35', '2021-08-12 08:13:10'),
('bobby', 'Fusce posuere felis sed lacus.', 'Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.
#fuscia', 'Thebault', 'Adi', '2021-04-23 16:56:09', '2022-01-14 06:35:51'),
('bobby', 'Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.', 'Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
Phasellus in felis. Donec semper sapien a libero. Nam dui.
#red', 'Claire', 'Alyson', '2021-06-05 04:03:52', '2021-04-21 16:51:40'),
('bobby', 'Proin eu mi.', 'Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.
Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.', 'Rodrick', 'Judd', '2021-09-15 04:12:40', '2021-07-16 08:11:59'),
('bobby', 'Cras in purus eu magna vulputate luctus.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
#turquoise', 'Heidi', 'Madlen', '2021-09-28 19:02:55', '2021-07-10 16:49:00'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
#blue', 'Yasmeen', 'Edie', '2021-12-29 02:35:31', '2021-09-28 00:32:13'),
('bobby', 'Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
#pink', 'Abbot', 'Nicoline', '2022-01-30 03:12:36', '2021-06-05 04:08:51'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.', 'Guthry', 'Darla', '2021-05-17 21:21:38', '2021-12-25 10:06:03'),
('bobby', 'Maecenas rhoncus aliquam lacus.', 'Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.', 'Andris', 'Leigh', '2021-02-16 03:49:50', '2021-01-23 08:55:39'),
('bobby', 'Vestibulum ac est lacinia nisi venenatis tristique.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.
#purple', 'Alika', 'Egbert', '2021-03-25 21:56:32', '2021-08-06 09:25:55'),
('bobby', 'In congue.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
#violet', 'Rosaleen', 'Laurel', '2021-05-31 02:31:10', '2021-05-25 07:40:17'),
('bobby', 'Nam tristique tortor eu pede.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
#turquoise', 'Rosie', 'Jeddy', '2021-04-21 13:04:12', '2021-12-21 21:27:10'),
('bobby', 'In sagittis dui vel nisl.', 'Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
#purple', 'Hermann', 'Dynah', '2021-08-11 15:17:07', '2021-07-26 14:59:15'),
('bobby', 'Ut tellus.', 'Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
#crimson', 'Blanch', 'Florinda', '2021-04-07 02:11:09', '2021-03-11 07:18:08'),
('bobby', 'Pellentesque at nulla.', 'Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
#teal', 'Gleda', 'Ellary', '2021-02-09 04:55:31', '2021-06-03 13:44:00'),
('bobby', 'Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
#red', 'Joete', 'Tedmund', '2021-02-24 21:47:59', '2021-03-26 22:36:33'),
('bobby', 'Suspendisse potenti.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.', 'Jamie', 'Alexa', '2021-08-06 04:32:39', '2021-02-19 12:04:36'),
('bobby', 'Nulla suscipit ligula in lacus.', 'Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.
Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.
#violet', 'Doris', 'Mendel', '2021-09-17 11:09:35', '2021-05-08 09:41:26'),
('bobby', 'Nulla ac enim.', 'Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.', 'Bartie', 'Tess', '2021-11-23 16:40:31', '2021-02-14 18:25:25'),
('bobby', 'Morbi ut odio.', 'Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.
#khaki', 'Sile', 'Bertram', '2021-07-05 03:55:44', '2021-04-26 06:11:20'),
('bobby', 'Proin interdum mauris non ligula pellentesque ultrices.', 'In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.
#orange', 'Stillman', 'Robinett', '2021-01-28 08:36:31', '2022-01-22 04:26:21'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.
#purple', 'Teresa', 'Geordie', '2021-10-01 23:56:53', '2021-03-14 14:48:32'),
('bobby', 'Vivamus in felis eu sapien cursus vestibulum.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
#turquoise', 'Silvie', 'Ely', '2021-06-25 15:27:52', '2021-07-11 22:35:10'),
('bobby', 'Sed ante.', 'Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.
Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
#turquoise', 'Marline', 'Avigdor', '2021-10-28 11:05:02', '2022-01-01 22:59:45'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
#fuscia', 'Bella', 'Redd', '2021-07-25 10:58:10', '2022-01-03 06:44:01'),
('bobby', 'Donec ut mauris eget massa tempor convallis.', 'Phasellus in felis. Donec semper sapien a libero. Nam dui.
#maroon', 'Rubie', 'Gallard', '2021-04-17 00:00:13', '2021-01-01 16:09:42'),
('bobby', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
#yellow', 'Meghan', 'Bone', '2021-10-01 06:58:34', '2021-08-06 07:47:53'),
('bobby', 'Integer non velit.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
#orange', 'Meris', 'Griffin', '2021-04-19 01:54:16', '2021-04-23 08:04:24'),
('bobby', 'Donec dapibus.', 'In congue. Etiam justo. Etiam pretium iaculis justo.
In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.
Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
#violet', 'Amy', 'Tann', '2021-05-06 13:30:44', '2021-12-04 03:54:16'),
('bobby', 'Duis at velit eu est congue elementum.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
#crimson', 'Colan', 'Anthe', '2021-11-27 23:07:19', '2021-04-21 19:58:19'),
('bobby', 'Etiam justo.', 'Vestibulum ac est lacinia nisi venenatis tristique. Fusce congue, diam id ornare imperdiet, sapien urna pretium nisl, ut volutpat sapien arcu sed augue. Aliquam erat volutpat.
In congue. Etiam justo. Etiam pretium iaculis justo.', 'Honor', 'Fayina', '2021-05-14 16:02:48', '2022-01-07 21:17:52'),
('bobby', 'Pellentesque eget nunc.', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.
Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.
Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.
#puce', 'Brooke', 'Demetris', '2021-11-14 19:35:48', '2021-09-27 23:55:31'),
('bobby', 'Curabitur gravida nisi at nibh.', 'Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
#red', 'Regina', 'Son', '2021-09-05 08:18:57', '2021-08-29 18:59:01'),
('bobby', 'Sed sagittis.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
Fusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem.
Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
#khaki', 'Matelda', 'Alla', '2021-09-08 21:13:52', '2021-07-02 08:49:38'),
('bobby', 'Morbi porttitor lorem id ligula.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
#turquoise', 'Brock', 'Ludwig', '2021-06-26 11:28:38', '2021-07-24 17:24:01'),
('bobby', 'Fusce consequat.', 'Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#red', 'Kat', 'Zelig', '2021-09-24 11:37:56', '2021-07-12 13:57:43'),
('bobby', 'Maecenas ut massa quis augue luctus tincidunt.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#blue', 'Thaddus', 'Merna', '2021-05-23 13:06:03', '2021-03-24 08:32:10'),
('bobby', 'Pellentesque viverra pede ac diam.', 'Duis bibendum, felis sed interdum venenatis, turpis enim blandit mi, in porttitor pede justo eu massa. Donec dapibus. Duis at velit eu est congue elementum.
In hac habitasse platea dictumst. Morbi vestibulum, velit id pretium iaculis, diam erat fermentum justo, nec condimentum neque sapien placerat ante. Nulla justo.
Aliquam quis turpis eget elit sodales scelerisque. Mauris sit amet eros. Suspendisse accumsan tortor quis turpis.', 'Ronnie', 'Brittaney', '2021-12-26 19:23:32', '2021-09-05 19:27:21'),
('bobby', 'In quis justo.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.
Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.
Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', 'Byron', 'Randy', '2021-08-18 13:40:37', '2021-12-28 08:34:19'),
('bobby', 'Fusce consequat.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', 'Neron', 'Christa', '2021-05-24 18:32:45', '2021-01-01 16:15:57'),
('bobby', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.', 'Donec diam neque, vestibulum eget, vulputate ut, ultrices vel, augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec pharetra, magna vestibulum aliquet ultrices, erat tortor sollicitudin mi, sit amet lobortis sapien sapien non mi. Integer ac neque.
Duis bibendum. Morbi non quam nec dui luctus rutrum. Nulla tellus.
In sagittis dui vel nisl. Duis ac nibh. Fusce lacus purus, aliquet at, feugiat non, pretium quis, lectus.
#yellow', 'Merilee', 'Dolli', '2021-04-20 00:10:42', '2021-03-27 16:42:26'),
('bobby', 'Proin at turpis a pede posuere nonummy.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.
Mauris enim leo, rhoncus sed, vestibulum sit amet, cursus id, turpis. Integer aliquet, massa id lobortis convallis, tortor risus dapibus augue, vel accumsan tellus nisi eu orci. Mauris lacinia sapien quis libero.
#indigo', 'Caron', 'Valle', '2021-11-23 23:38:55', '2021-03-23 16:50:35'),
('bobby', 'Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.', 'Morbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem.
#mauv', 'Delbert', 'Cammy', '2021-06-03 08:38:23', '2021-07-16 21:36:19'),
('bobby', 'Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est.', 'Maecenas leo odio, condimentum id, luctus nec, molestie sed, justo. Pellentesque viverra pede ac diam. Cras pellentesque volutpat dui.
Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.
Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.
#crimson', 'Konstantin', 'Sarine', '2021-12-21 13:46:23', '2021-12-27 03:46:03'),
('bobby', 'Nunc purus.', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin risus. Praesent lectus.
Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.', 'Krysta', 'Euphemia', '2021-05-03 23:53:27', '2021-04-16 15:39:57'),
('bobby', 'Etiam pretium iaculis justo.', 'Morbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.
#turquoise', 'Oliver', 'Clint', '2021-06-12 07:00:00', '2021-06-14 11:33:22'),
('bobby', 'In quis justo.', 'Vestibulum quam sapien, varius ut, blandit non, interdum in, ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis faucibus accumsan odio. Curabitur convallis.
#red', 'Vito', 'Bird', '2021-06-20 08:39:02', '2021-05-06 03:06:08'),
('bobby', 'In sagittis dui vel nisl.', 'Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.', 'Errick', 'Shirlee', '2021-08-18 08:08:42', '2021-11-04 15:44:08'),
('bobby', 'Integer ac leo.', 'Nulla ut erat id mauris vulputate elementum. Nullam varius. Nulla facilisi.
Cras non velit nec nisi vulputate nonummy. Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque.
Quisque porta volutpat erat. Quisque erat eros, viverra eget, congue eget, semper rutrum, nulla. Nunc purus.
#puce', 'Benjamin', 'Arlie', '2021-11-23 02:21:46', '2021-02-13 07:35:14'),
('bobby', 'Morbi non quam nec dui luctus rutrum.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.
#yellow', 'Tessy', 'Nan', '2021-10-07 20:30:36', '2021-03-06 01:51:12'),
('bobby', 'Nulla justo.', 'Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.', 'Babette', 'Dudley', '2021-02-05 15:19:07', '2021-04-01 14:46:59'),
('bobby', 'Aenean lectus.', 'Sed sagittis. Nam congue, risus semper porta volutpat, quam pede lobortis ligula, sit amet eleifend pede libero quis orci. Nullam molestie nibh in lectus.
Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
#yellow', 'Hoyt', 'Austina', '2021-06-26 18:20:38', '2021-02-20 16:09:49'),
('bobby', 'Ut tellus.', 'Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', null, 'Wilmer', 'Ingra', '2021-07-19 14:18:17', '2022-01-23 17:29:54')
Praesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio.', 'Wilmer', 'Ingra', '2021-07-19 14:18:17', '2022-01-23 17:29:54')
;
-- 1000 댓글
-- 300 댓글
insert into article_comment (article_id, user_id, content, created_at, modified_at, created_by, modified_by) values
(49, 'bobby', 'Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', '2021-03-02 22:40:04', '2021-04-27 15:38:09', 'Lind', 'Orv'),
(108, 'bobby', 'Quisque id justo sit amet sapien dignissim vestibulum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla dapibus dolor vel est. Donec odio justo, sollicitudin ut, suscipit a, feugiat et, eros.', '2021-06-08 04:36:02', '2022-01-25 15:35:42', 'Trstram', 'Loy'),
@@ -560,4 +875,125 @@ insert into article_comment (article_id, user_id, content, created_at, modified_
(77, 'bobby', 'Aenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.', '2022-01-08 02:32:10', '2021-07-23 12:21:01', 'Harlen', 'Zacharia'),
(56, 'bobby', 'Sed ante. Vivamus tortor. Duis mattis egestas metus.', '2021-11-18 01:32:48', '2021-06-06 01:59:25', 'Vittorio', 'Milty'),
(19, 'bobby', 'In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.', '2021-05-07 23:57:29', '2021-04-03 21:55:11', 'Oliver', 'Graehme')
;
insert into hashtag (hashtag_name, created_at, modified_at, created_by, modified_by) values
('blue', now(), now(), 'bobby', 'bobby'),
('crimson', now(), now(), 'bobby', 'bobby'),
('fuscia', now(), now(), 'bobby', 'bobby'),
('goldenrod', now(), now(), 'bobby', 'bobby'),
('green', now(), now(), 'bobby', 'bobby'),
('indigo', now(), now(), 'bobby', 'bobby'),
('khaki', now(), now(), 'bobby', 'bobby'),
('maroon', now(), now(), 'bobby', 'bobby'),
('mauv', now(), now(), 'bobby', 'bobby'),
('orange', now(), now(), 'bobby', 'bobby'),
('pink', now(), now(), 'bobby', 'bobby'),
('puce', now(), now(), 'bobby', 'bobby'),
('purple', now(), now(), 'bobby', 'bobby'),
('red', now(), now(), 'bobby', 'bobby'),
('teal', now(), now(), 'bobby', 'bobby'),
('turquoise', now(), now(), 'bobby', 'bobby'),
('violet', now(), now(), 'bobby', 'bobby'),
('yellow', now(), now(), 'bobby', 'bobby'),
('white', now(), now(), 'bobby', 'bobby')
;
insert into article_hashtag (article_id, hashtag_id) values
(1, 11),
(2, 13),
(3, 13),
(4, 9),
(5, 5),
(6, 8),
(7, 10),
(8, 15),
(9, 7),
(10, 12),
(11, 10),
(12, 13),
(13, 8),
(15, 7),
(18, 4),
(19, 18),
(20, 10),
(21, 3),
(22, 12),
(24, 15),
(25, 3),
(26, 8),
(27, 15),
(28, 16),
(29, 3),
(31, 1),
(32, 18),
(33, 11),
(34, 4),
(35, 1),
(37, 13),
(38, 5),
(40, 16),
(42, 3),
(43, 17),
(45, 14),
(45, 19),
(47, 13),
(48, 2),
(49, 6),
(50, 7),
(52, 16),
(54, 11),
(55, 10),
(57, 10),
(58, 11),
(59, 2),
(60, 2),
(61, 15),
(63, 17),
(64, 17),
(65, 17),
(66, 16),
(67, 12),
(68, 3),
(70, 12),
(71, 11),
(72, 3),
(73, 14),
(75, 16),
(76, 1),
(77, 11),
(80, 13),
(81, 17),
(82, 16),
(83, 13),
(84, 2),
(85, 15),
(86, 14),
(88, 17),
(90, 7),
(91, 10),
(92, 13),
(93, 16),
(94, 16),
(95, 3),
(96, 8),
(97, 18),
(98, 10),
(99, 17),
(100, 2),
(102, 12),
(103, 14),
(104, 7),
(105, 16),
(106, 14),
(107, 1),
(111, 18),
(112, 6),
(113, 9),
(114, 2),
(116, 16),
(117, 14),
(119, 12),
(120, 18),
(122, 18)
;

View File

@@ -5,6 +5,7 @@ import com.example.board.domain.constant.FormStatus;
import com.example.board.domain.constant.SearchType;
import com.example.board.dto.ArticleDto;
import com.example.board.dto.ArticleWithCommentsDto;
import com.example.board.dto.HashtagDto;
import com.example.board.dto.UserAccountDto;
import com.example.board.dto.request.ArticleRequest;
import com.example.board.dto.response.ArticleResponse;
@@ -256,12 +257,12 @@ class ArticleControllerTest {
.andExpect(model().attribute("formStatus", FormStatus.CREATE));
}
@WithUserDetails(value = "testId", setupBefore = TestExecutionEvent.TEST_EXECUTION)
@WithUserDetails(value = "unoTest", setupBefore = TestExecutionEvent.TEST_EXECUTION)
@DisplayName("[view][POST] 새 게시글 등록 - 정상 호출")
@Test
void givenNewArticleInfo_whenRequesting_thenSavesNewArticle() throws Exception {
// Given
ArticleRequest articleRequest = ArticleRequest.of("new title", "new content", "#new");
ArticleRequest articleRequest = ArticleRequest.of("new title", "new content");
willDoNothing().given(articleService).saveArticle(any(ArticleDto.class));
// When & Then
@@ -315,7 +316,7 @@ class ArticleControllerTest {
void givenUpdatedArticleInfo_whenRequesting_thenUpdatesNewArticle() throws Exception {
// Given
long articleId = 1L;
ArticleRequest articleRequest = ArticleRequest.of("new title", "new content", "#new");
ArticleRequest articleRequest = ArticleRequest.of("new title", "new content");
willDoNothing().given(articleService).updateArticle(eq(articleId), any(ArticleDto.class));
// When & Then
@@ -359,7 +360,7 @@ class ArticleControllerTest {
createUserAccountDto(),
"title",
"content",
"#java"
Set.of(HashtagDto.of("java"))
);
}
@@ -370,7 +371,7 @@ class ArticleControllerTest {
Set.of(),
"title",
"content",
"#java",
Set.of(HashtagDto.of("java")),
LocalDateTime.now(),
"bobby",
LocalDateTime.now(),

View File

@@ -2,6 +2,7 @@ package com.example.board.repository;
import com.example.board.config.JpaConfig;
import com.example.board.domain.Article;
import com.example.board.domain.Hashtag;
import com.example.board.domain.UserAccount;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -10,11 +11,12 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
@@ -25,15 +27,18 @@ class JpaRepositoryTest {
private final ArticleRepository articleRepository;
private final ArticleCommentRepository articleCommentRepository;
private final UserAccountRepository userAccountRepository;
private final HashtagRepository hashtagRepository;
public JpaRepositoryTest(
@Autowired ArticleRepository articleRepository,
@Autowired ArticleCommentRepository articleCommentRepository,
@Autowired UserAccountRepository userAccountRepository
@Autowired UserAccountRepository userAccountRepository,
@Autowired HashtagRepository hashtagRepository
) {
this.articleRepository = articleRepository;
this.articleCommentRepository = articleCommentRepository;
this.userAccountRepository = userAccountRepository;
this.hashtagRepository = hashtagRepository;
}
@DisplayName("select 테스트")
@@ -57,8 +62,8 @@ class JpaRepositoryTest {
long previousCount = articleRepository.count();
UserAccount userAccount =
userAccountRepository.save(UserAccount.of("kim", "1234", null, null, null));
Article article =
articleRepository.save(Article.of(userAccount, "new article", "new content", "#spring"));
Article article = Article.of(userAccount, "new article", "new content");
article.addHashtags(Set.of(Hashtag.of("spring")));
// When
articleRepository.save(article);
@@ -72,14 +77,18 @@ class JpaRepositoryTest {
void givenTestData_whenUpdating_thenWorksFine() {
// Given
Article article = articleRepository.findById(1L).orElseThrow();
String updatedHashtag = "#springboot";
article.setHashtag(updatedHashtag);
Hashtag updatedHashtag = Hashtag.of("springboot");
article.clearHashtags();
article.addHashtags(Set.of(updatedHashtag));
// When
Article savedArticle = articleRepository.saveAndFlush(article);
// Then
assertThat(savedArticle).hasFieldOrPropertyWithValue("hashtag", updatedHashtag);
assertThat(savedArticle.getHashtags())
.hasSize(1)
.extracting("hashtagName", String.class)
.containsExactly(updatedHashtag.getHashtagName());
}
@DisplayName("delete 테스트")
@@ -99,6 +108,41 @@ class JpaRepositoryTest {
assertThat(articleCommentRepository.count()).isEqualTo(previousArticleCommentCount - deletedCommentsSize);
}
@DisplayName("[Querydsl] 전체 hashtag 리스트에서 이름만 조회하기")
@Test
void givenNothing_whenQueryingHashtags_thenReturnsHashtagNames() {
// Given
// When
List<String> hashtagNames = hashtagRepository.findAllHashtagNames();
// Then
assertThat(hashtagNames).hasSize(19);
}
@DisplayName("[Querydsl] hashtag로 페이징된 게시글 검색하기")
@Test
void givenHashtagNamesAndPageable_whenQueryingArticles_thenReturnsArticlePage() {
// Given
List<String> hashtagNames = List.of("blue", "crimson", "fuscia");
Pageable pageable = PageRequest.of(0, 5, Sort.by(
Sort.Order.desc("hashtags.hashtagName"),
Sort.Order.asc("title")
));
// When
Page<Article> articlePage = articleRepository.findByHashtagNames(hashtagNames, pageable);
// Then
assertThat(articlePage.getContent()).hasSize(pageable.getPageSize());
assertThat(articlePage.getContent().get(0).getTitle()).isEqualTo("Fusce posuere felis sed lacus.");
assertThat(articlePage.getContent().get(0).getHashtags())
.extracting("hashtagName", String.class)
.containsExactly("fuscia");
assertThat(articlePage.getTotalElements()).isEqualTo(17);
assertThat(articlePage.getTotalPages()).isEqualTo(4);
}
@EnableJpaAuditing
@TestConfiguration
public static class TestJpaConfig {

View File

@@ -2,6 +2,7 @@ package com.example.board.service;
import com.example.board.domain.Article;
import com.example.board.domain.ArticleComment;
import com.example.board.domain.Hashtag;
import com.example.board.domain.UserAccount;
import com.example.board.dto.ArticleCommentDto;
import com.example.board.dto.UserAccountDto;
@@ -18,6 +19,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
import javax.persistence.EntityNotFoundException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.*;
@@ -171,7 +173,7 @@ class ArticleCommentServiceTest {
private ArticleComment createArticleComment(String content) {
return ArticleComment.of(
Article.of(createUserAccount(), "title", "content", "hashtag"),
createArticle(),
createUserAccount(),
content
);
@@ -188,11 +190,17 @@ class ArticleCommentServiceTest {
}
private Article createArticle() {
return Article.of(
Article article = Article.of(
createUserAccount(),
"title",
"content",
"#java"
"content"
);
article.addHashtags(Set.of(createHashtag(article)));
return article;
}
private Hashtag createHashtag(Article article) {
return Hashtag.of("java");
}
}

View File

@@ -1,13 +1,17 @@
package com.example.board.service;
import com.example.board.domain.Article;
import com.example.board.domain.Hashtag;
import com.example.board.domain.UserAccount;
import com.example.board.domain.constant.SearchType;
import com.example.board.dto.ArticleDto;
import com.example.board.dto.ArticleWithCommentsDto;
import com.example.board.dto.HashtagDto;
import com.example.board.dto.UserAccountDto;
import com.example.board.repository.ArticleRepository;
import com.example.board.repository.HashtagRepository;
import com.example.board.repository.UserAccountRepository;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -15,16 +19,19 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.test.util.ReflectionTestUtils;
import javax.persistence.EntityNotFoundException;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
@DisplayName("비즈니스 로직 - 게시글")
@@ -34,23 +41,22 @@ class ArticleServiceTest {
@InjectMocks
private ArticleService sut;
@Mock
private ArticleRepository articleRepository;
@Mock
private UserAccountRepository userAccountRepository;
@Mock private ArticleRepository articleRepository;
@Mock private UserAccountRepository userAccountRepository;
@Mock private HashtagService hashtagService;
@Mock private HashtagRepository hashtagRepository;
@DisplayName("검색어 없이 게시글을 검색하면, 게시글 페이지를 반환한다.")
@Test
void givenNoSearchParameters_whenSearchingArticles_thenReturnsArticlePage() {
// given
// Given
Pageable pageable = Pageable.ofSize(20);
given(articleRepository.findAll(pageable)).willReturn(Page.empty());
// when
// When
Page<ArticleDto> articles = sut.searchArticles(null, null, pageable);
// then
// Then
assertThat(articles).isEmpty();
then(articleRepository).should().findAll(pageable);
}
@@ -83,23 +89,41 @@ class ArticleServiceTest {
// Then
assertThat(articles).isEqualTo(Page.empty(pageable));
then(hashtagRepository).shouldHaveNoInteractions();
then(articleRepository).shouldHaveNoInteractions();
}
@DisplayName("없는 해시태그를 검색하면, 빈 페이지를 반환한다.")
@Test
void givenNonexistentHashtag_whenSearchingArticlesViaHashtag_thenReturnsEmptyPage() {
// Given
String hashtagName = "난 없지롱";
Pageable pageable = Pageable.ofSize(20);
given(articleRepository.findByHashtagNames(List.of(hashtagName), pageable)).willReturn(new PageImpl<>(List.of(), pageable, 0));
// When
Page<ArticleDto> articles = sut.searchArticlesViaHashtag(hashtagName, pageable);
// Then
assertThat(articles).isEqualTo(Page.empty(pageable));
then(articleRepository).should().findByHashtagNames(List.of(hashtagName), pageable);
}
@DisplayName("게시글을 해시태그 검색하면, 게시글 페이지를 반환한다.")
@Test
void givenHashtag_whenSearchingArticlesViaHashtag_thenReturnsArticlesPage() {
// Given
String hashtag = "#java";
String hashtagName = "java";
Pageable pageable = Pageable.ofSize(20);
given(articleRepository.findByHashtag(hashtag, pageable)).willReturn(Page.empty(pageable));
Article expectedArticle = createArticle();
given(articleRepository.findByHashtagNames(List.of(hashtagName), pageable)).willReturn(new PageImpl<>(List.of(expectedArticle), pageable, 1));
// When
Page<ArticleDto> articles = sut.searchArticlesViaHashtag(hashtag, pageable);
Page<ArticleDto> articles = sut.searchArticlesViaHashtag(hashtagName, pageable);
// Then
assertThat(articles).isEqualTo(Page.empty(pageable));
then(articleRepository).should().findByHashtag(hashtag, pageable);
assertThat(articles).isEqualTo(new PageImpl<>(List.of(ArticleDto.from(expectedArticle)), pageable, 1));
then(articleRepository).should().findByHashtagNames(List.of(hashtagName), pageable);
}
@DisplayName("게시글 ID로 조회하면, 댓글 달긴 게시글을 반환한다.")
@@ -117,7 +141,10 @@ class ArticleServiceTest {
assertThat(dto)
.hasFieldOrPropertyWithValue("title", article.getTitle())
.hasFieldOrPropertyWithValue("content", article.getContent())
.hasFieldOrPropertyWithValue("hashtag", article.getHashtag());
.hasFieldOrPropertyWithValue("hashtagDtos", article.getHashtags().stream()
.map(HashtagDto::from)
.collect(Collectors.toUnmodifiableSet())
);
then(articleRepository).should().findById(articleId);
}
@@ -138,10 +165,10 @@ class ArticleServiceTest {
then(articleRepository).should().findById(articleId);
}
@DisplayName("게시글을 조회하면 게시글을 반환한다.")
@DisplayName("게시글을 조회하면, 게시글을 반환한다.")
@Test
void givenArticleId_whenSearchingArticle_thenReturnArticle() {
// given
void givenArticleId_whenSearchingArticle_thenReturnsArticle() {
// Given
Long articleId = 1L;
Article article = createArticle();
given(articleRepository.findById(articleId)).willReturn(Optional.of(article));
@@ -153,7 +180,10 @@ class ArticleServiceTest {
assertThat(dto)
.hasFieldOrPropertyWithValue("title", article.getTitle())
.hasFieldOrPropertyWithValue("content", article.getContent())
.hasFieldOrPropertyWithValue("hashtag", article.getHashtag());
.hasFieldOrPropertyWithValue("hashtagDtos", article.getHashtags().stream()
.map(HashtagDto::from)
.collect(Collectors.toUnmodifiableSet())
);
then(articleRepository).should().findById(articleId);
}
@@ -165,7 +195,7 @@ class ArticleServiceTest {
given(articleRepository.findById(articleId)).willReturn(Optional.empty());
// When
Throwable t = catchThrowable(() -> sut.getArticleWithComments(articleId));
Throwable t = catchThrowable(() -> sut.getArticle(articleId));
// Then
assertThat(t)
@@ -174,49 +204,71 @@ class ArticleServiceTest {
then(articleRepository).should().findById(articleId);
}
@DisplayName("게시글 정보를 입력하면 게시글을 생성한다.")
@DisplayName("게시글 정보를 입력하면, 본문에서 해시태그 정보를 추출하여 해시태그 정보가 포함된 게시글을 생성한다.")
@Test
void givenArticleInfo_whenSavingArticle_thenSavesArticle() {
// given
void givenArticleInfo_whenSavingArticle_thenExtractsHashtagsFromContentAndSavesArticleWithExtractedHashtags() {
// Given
ArticleDto dto = createArticleDto();
Set<String> expectedHashtagNames = Set.of("java", "spring");
Set<Hashtag> expectedHashtags = new HashSet<>();
expectedHashtags.add(createHashtag("java"));
given(userAccountRepository.getReferenceById(dto.userAccountDto().userId())).willReturn(createUserAccount());
given(hashtagService.parseHashtagNames(dto.content())).willReturn(expectedHashtagNames);
given(hashtagService.findHashtagsByNames(expectedHashtagNames)).willReturn(expectedHashtags);
given(articleRepository.save(any(Article.class))).willReturn(createArticle());
// when
// When
sut.saveArticle(dto);
// then
// Then
then(userAccountRepository).should().getReferenceById(dto.userAccountDto().userId());
then(hashtagService).should().parseHashtagNames(dto.content());
then(hashtagService).should().findHashtagsByNames(expectedHashtagNames);
then(articleRepository).should().save(any(Article.class));
}
@DisplayName("게시글의 수정 정보를 입력하면, 게시글을 수정한다.")
@Test
void givenArticleIdModifiedInfo_whenUpdatingArticle_thenUpdatesArticle() {
// given
void givenModifiedArticleInfo_whenUpdatingArticle_thenUpdatesArticle() {
// Given
Article article = createArticle();
ArticleDto dto = createArticleDto("새 타이틀", "새 내용", "#springboot");
ArticleDto dto = createArticleDto("새 타이틀", "새 내용 #springboot");
Set<String> expectedHashtagNames = Set.of("springboot");
Set<Hashtag> expectedHashtags = new HashSet<>();
given(articleRepository.getReferenceById(dto.id())).willReturn(article);
given(userAccountRepository.getReferenceById(dto.userAccountDto().userId())).willReturn(dto.userAccountDto().toEntity());
willDoNothing().given(articleRepository).flush();
willDoNothing().given(hashtagService).deleteHashtagWithoutArticles(any());
given(hashtagService.parseHashtagNames(dto.content())).willReturn(expectedHashtagNames);
given(hashtagService.findHashtagsByNames(expectedHashtagNames)).willReturn(expectedHashtags);
// when
// When
sut.updateArticle(dto.id(), dto);
// then
// Then
assertThat(article)
.hasFieldOrPropertyWithValue("title", dto.title())
.hasFieldOrPropertyWithValue("content", dto.content())
.hasFieldOrPropertyWithValue("hashtag", dto.hashtag());
.extracting("hashtags", as(InstanceOfAssertFactories.COLLECTION))
.hasSize(1)
.extracting("hashtagName")
.containsExactly("springboot");
then(articleRepository).should().getReferenceById(dto.id());
then(userAccountRepository).should().getReferenceById(dto.userAccountDto().userId());
then(articleRepository).should().flush();
then(hashtagService).should(times(2)).deleteHashtagWithoutArticles(any());
then(hashtagService).should().parseHashtagNames(dto.content());
then(hashtagService).should().findHashtagsByNames(expectedHashtagNames);
}
@DisplayName("없는 게시글의 수정 정보를 입력하면, 경고 로그를 찍고 아무 것도 하지 않는다.")
@Test
void givenNonexistentArticleInfo_whenUpdatingArticle_thenLogsWarningAndDoesNothing() {
// Given
ArticleDto dto = createArticleDto("새 타이틀", "새 내용", "#springboot");
ArticleDto dto = createArticleDto("새 타이틀", "새 내용");
given(articleRepository.getReferenceById(dto.id())).willThrow(EntityNotFoundException.class);
// When
@@ -224,41 +276,89 @@ class ArticleServiceTest {
// Then
then(articleRepository).should().getReferenceById(dto.id());
then(userAccountRepository).shouldHaveNoInteractions();
then(hashtagService).shouldHaveNoInteractions();
}
@DisplayName("게시글의 ID를 입력하면 게시글을 삭제한다.")
@DisplayName("게시글 작성자가 아닌 사람이 수정 정보를 입력하면, 아무 것도 하지 않는다.")
@Test
void givenModifiedArticleInfoWithDifferentUser_whenUpdatingArticle_thenDoesNothing() {
// Given
Long differentArticleId = 22L;
Article differentArticle = createArticle(differentArticleId);
differentArticle.setUserAccount(createUserAccount("John"));
ArticleDto dto = createArticleDto("새 타이틀", "새 내용");
given(articleRepository.getReferenceById(differentArticleId)).willReturn(differentArticle);
given(userAccountRepository.getReferenceById(dto.userAccountDto().userId())).willReturn(dto.userAccountDto().toEntity());
// When
sut.updateArticle(differentArticleId, dto);
// Then
then(articleRepository).should().getReferenceById(differentArticleId);
then(userAccountRepository).should().getReferenceById(dto.userAccountDto().userId());
then(hashtagService).shouldHaveNoInteractions();
}
@DisplayName("게시글의 ID를 입력하면, 게시글을 삭제한다")
@Test
void givenArticleId_whenDeletingArticle_thenDeletesArticle() {
// given
// Given
Long articleId = 1L;
String userId = "bobby";
String userId = "uno";
given(articleRepository.getReferenceById(articleId)).willReturn(createArticle());
willDoNothing().given(articleRepository).deleteByIdAndUserAccount_UserId(articleId, userId);
willDoNothing().given(articleRepository).flush();
willDoNothing().given(hashtagService).deleteHashtagWithoutArticles(any());
// when
// When
sut.deleteArticle(1L, userId);
// then
// Then
then(articleRepository).should().getReferenceById(articleId);
then(articleRepository).should().deleteByIdAndUserAccount_UserId(articleId, userId);
then(articleRepository).should().flush();
then(hashtagService).should(times(2)).deleteHashtagWithoutArticles(any());
}
@DisplayName("게시글 수를 조회하면, 게시글 수를 반환한다")
@Test
void givenNothing_whenCountingArticles_thenReturnsArticleCount() {
// Given
long expected = 0L;
given(articleRepository.count()).willReturn(expected);
// When
long actual = sut.getArticleCount();
// Then
assertThat(actual).isEqualTo(expected);
then(articleRepository).should().count();
}
@DisplayName("해시태그를 조회하면, 유니크 해시태그 리스트를 반환한다")
@Test
void givenNothing_whenCalling_thenReturnsHashtags() {
// Given
List<String> expectedHashtags = List.of("#java", "#spring", "#boot");
given(articleRepository.findAllDistinctHashtags()).willReturn(expectedHashtags);
Article article = createArticle();
List<String> expectedHashtags = List.of("java", "spring", "boot");
given(hashtagRepository.findAllHashtagNames()).willReturn(expectedHashtags);
// When
List<String> actualHashtags = sut.getHashtags();
// Then
assertThat(actualHashtags).isEqualTo(expectedHashtags);
then(articleRepository).should().findAllDistinctHashtags();
then(hashtagRepository).should().findAllHashtagNames();
}
private UserAccount createUserAccount() {
return createUserAccount("bobby");
}
private UserAccount createUserAccount(String userId) {
return UserAccount.of(
"bobby",
userId,
"password",
"bobby@email.com",
"bobby",
@@ -267,28 +367,50 @@ class ArticleServiceTest {
}
private Article createArticle() {
return createArticle(1L);
}
private Article createArticle(Long id) {
Article article = Article.of(
createUserAccount(),
"title",
"content",
"#java"
"content"
);
ReflectionTestUtils.setField(article, "id", 1L);
article.addHashtags(Set.of(
createHashtag(1L, "java"),
createHashtag(2L, "spring")
));
ReflectionTestUtils.setField(article, "id", id);
return article;
}
private ArticleDto createArticleDto() {
return createArticleDto("title", "content", "#java");
private Hashtag createHashtag(String hashtagName) {
return createHashtag(1L, hashtagName);
}
private ArticleDto createArticleDto(String title, String content, String hashtag) {
private Hashtag createHashtag(Long id, String hashtagName) {
Hashtag hashtag = Hashtag.of(hashtagName);
ReflectionTestUtils.setField(hashtag, "id", id);
return hashtag;
}
private HashtagDto createHashtagDto() {
return HashtagDto.of("java");
}
private ArticleDto createArticleDto() {
return createArticleDto("title", "content");
}
private ArticleDto createArticleDto(String title, String content) {
return ArticleDto.of(
1L,
createUserAccountDto(),
title,
content,
hashtag,
null,
LocalDateTime.now(),
"bobby",
LocalDateTime.now(),