diff --git a/main-service/pom.xml b/main-service/pom.xml
index 82a4b30..6e7b885 100644
--- a/main-service/pom.xml
+++ b/main-service/pom.xml
@@ -56,8 +56,43 @@
org.springframework.boot
spring-boot-starter-validation
+
+
+ com.querydsl
+ querydsl-jpa
+ jakarta
+
+
+
+
+ com.mysema.maven
+ apt-maven-plugin
+ 1.1.3
+
+
+
+ process
+
+
+ target/generated-sources/java
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+ com.querydsl
+ querydsl-apt
+ jakarta
+ ${querydsl.version}
+
+
+
+
+
+
dev
diff --git a/main-service/src/main/java/ru/practicum/config/DateTimeProperties.java b/main-service/src/main/java/ru/practicum/config/DateTimeProperties.java
new file mode 100644
index 0000000..79f229f
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/config/DateTimeProperties.java
@@ -0,0 +1,13 @@
+package ru.practicum.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Component
+@ConfigurationProperties(prefix = "app")
+public class DateTimeProperties {
+ @Getter @Setter private String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
+}
diff --git a/main-service/src/main/java/ru/practicum/config/JsonConfig.java b/main-service/src/main/java/ru/practicum/config/JsonConfig.java
index feaa326..82059fa 100644
--- a/main-service/src/main/java/ru/practicum/config/JsonConfig.java
+++ b/main-service/src/main/java/ru/practicum/config/JsonConfig.java
@@ -9,18 +9,23 @@
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import lombok.RequiredArgsConstructor;
+
@Configuration
+@RequiredArgsConstructor
public class JsonConfig {
- private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+ private final DateTimeProperties properties;
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
- builder.simpleDateFormat(DATE_TIME_PATTERN);
+ builder.simpleDateFormat(properties.getDateTimeFormat());
builder.serializers(
- new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
+ new LocalDateTimeSerializer(
+ DateTimeFormatter.ofPattern(properties.getDateTimeFormat())));
builder.deserializers(
- new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
+ new LocalDateTimeDeserializer(
+ DateTimeFormatter.ofPattern(properties.getDateTimeFormat())));
};
}
}
diff --git a/main-service/src/main/java/ru/practicum/config/WebConfig.java b/main-service/src/main/java/ru/practicum/config/WebConfig.java
new file mode 100644
index 0000000..6fcbd80
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/config/WebConfig.java
@@ -0,0 +1,38 @@
+package ru.practicum.config;
+
+import java.text.ParseException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.format.Formatter;
+import org.springframework.format.FormatterRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import lombok.RequiredArgsConstructor;
+
+@Configuration
+@RequiredArgsConstructor
+public class WebConfig implements WebMvcConfigurer {
+ private final DateTimeProperties properties;
+
+ @Override
+ public void addFormatters(FormatterRegistry registry) {
+ registry.addFormatter(
+ new Formatter() {
+
+ @Override
+ public String print(LocalDateTime object, Locale locale) {
+ return object.format(
+ DateTimeFormatter.ofPattern(properties.getDateTimeFormat()));
+ }
+
+ @Override
+ public LocalDateTime parse(String text, Locale locale) throws ParseException {
+ return LocalDateTime.parse(
+ text, DateTimeFormatter.ofPattern(properties.getDateTimeFormat()));
+ }
+ });
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/controller/EventAdminController.java b/main-service/src/main/java/ru/practicum/event/controller/EventAdminController.java
new file mode 100644
index 0000000..31fd7e7
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/controller/EventAdminController.java
@@ -0,0 +1,49 @@
+package ru.practicum.event.controller;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+
+import jakarta.validation.Valid;
+
+import ru.practicum.event.dto.EventFullDto;
+import ru.practicum.event.dto.UpdateEventAdminRequest;
+import ru.practicum.event.model.EventState;
+import ru.practicum.event.service.EventService;
+import ru.practicum.event.service.EventsAdminGetRequest;
+
+import org.springframework.web.bind.annotation.*;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/admin/events")
+public class EventAdminController {
+ private final EventService eventService;
+
+ @GetMapping
+ public Collection getEventsFiltered(
+ @RequestParam(required = false) List users,
+ @RequestParam(required = false) List states,
+ @RequestParam(required = false) List categories,
+ @RequestParam(required = false) LocalDateTime rangeStart,
+ @RequestParam(required = false) LocalDateTime rangeEnd,
+ @RequestParam(defaultValue = "0") int from,
+ @RequestParam(defaultValue = "10") int size) {
+ EventsAdminGetRequest getRequest =
+ new EventsAdminGetRequest(
+ users, states, categories, rangeStart, rangeEnd, from, size);
+ log.info("Admin get events requested with params= {}", getRequest);
+ return eventService.getEvents(getRequest);
+ }
+
+ @PatchMapping("/{eventId}")
+ public EventFullDto updateEvent(
+ @PathVariable Long eventId, @RequestBody @Valid UpdateEventAdminRequest updateRequest) {
+ log.info("Admin update event requested with body= {}", updateRequest);
+ return eventService.updateEvent(eventId, updateRequest);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/controller/EventPrivateController.java b/main-service/src/main/java/ru/practicum/event/controller/EventPrivateController.java
new file mode 100644
index 0000000..d0c0976
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/controller/EventPrivateController.java
@@ -0,0 +1,63 @@
+package ru.practicum.event.controller;
+
+import java.util.Collection;
+
+import jakarta.validation.Valid;
+
+import ru.practicum.event.dto.EventFullDto;
+import ru.practicum.event.dto.EventShortDto;
+import ru.practicum.event.dto.NewEventDto;
+import ru.practicum.event.dto.UpdateEventUserRequest;
+import ru.practicum.event.service.EventService;
+import ru.practicum.event.service.EventsPrivateGetRequest;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/users/{userId}/events")
+public class EventPrivateController {
+ private final EventService eventService;
+
+ @GetMapping()
+ public Collection getEventsOfUserPaged(
+ @PathVariable Long userId,
+ @RequestParam(defaultValue = "0") int from,
+ @RequestParam(defaultValue = "10") int size) {
+ EventsPrivateGetRequest getRequest = new EventsPrivateGetRequest(userId, from, size);
+ log.info("Private get events requested with params= {}", getRequest);
+ return eventService.getEvents(getRequest);
+ }
+
+ @PostMapping()
+ @ResponseStatus(HttpStatus.CREATED)
+ public EventFullDto createEvent(
+ @PathVariable Long userId, @RequestBody @Valid NewEventDto newEventDto) {
+ log.info("Create event requested with body= {}", newEventDto);
+ return eventService.createEvent(userId, newEventDto);
+ }
+
+ @GetMapping("/{eventId}")
+ public EventFullDto getEvent(@PathVariable Long userId, @PathVariable Long eventId) {
+ log.info("Private get event requested with userId= {}, eventId= {}", userId, eventId);
+ return eventService.getByUserById(userId, eventId);
+ }
+
+ @PatchMapping("/{eventId}")
+ public EventFullDto updateEvent(
+ @PathVariable Long userId,
+ @PathVariable Long eventId,
+ @RequestBody @Valid UpdateEventUserRequest updateRequest) {
+ log.info(
+ "Private update event requested with userId= {}, eventId= {}, body = {}",
+ userId,
+ eventId,
+ updateRequest);
+ return eventService.updateEventByUser(userId, eventId, updateRequest);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/controller/EventPublicController.java b/main-service/src/main/java/ru/practicum/event/controller/EventPublicController.java
new file mode 100644
index 0000000..8501170
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/controller/EventPublicController.java
@@ -0,0 +1,65 @@
+package ru.practicum.event.controller;
+
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.List;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import ru.practicum.event.dto.EventFullDto;
+import ru.practicum.event.dto.EventShortDto;
+import ru.practicum.event.service.EventService;
+import ru.practicum.event.service.EventsPublicGetRequest;
+import ru.practicum.exception.ValidationException;
+
+import org.springframework.web.bind.annotation.*;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/events")
+public class EventPublicController {
+ private final EventService eventService;
+
+ @GetMapping()
+ public Collection getEventsFiltered(
+ @RequestParam(required = false) String text,
+ @RequestParam(required = false) List categories,
+ @RequestParam(required = false) Boolean paid,
+ @RequestParam(required = false) LocalDateTime rangeStart,
+ @RequestParam(required = false) LocalDateTime rangeEnd,
+ @RequestParam(defaultValue = "false") boolean onlyAvailable,
+ @RequestParam(required = false) EventSortBy sort,
+ @RequestParam(defaultValue = "0") int from,
+ @RequestParam(defaultValue = "10") int size,
+ HttpServletRequest request) {
+ EventsPublicGetRequest getRequest =
+ new EventsPublicGetRequest(
+ text,
+ categories,
+ paid,
+ rangeStart,
+ rangeEnd,
+ onlyAvailable,
+ sort,
+ from,
+ size,
+ request);
+ if (getRequest.hasRangeStart() && getRequest.hasRangeEnd()) {
+ if (getRequest.rangeEnd().isBefore(getRequest.rangeStart())) {
+ throw new ValidationException("End date must be before start date");
+ }
+ }
+ log.info("Public get events requested with params= {}", getRequest);
+ return eventService.getEvents(getRequest);
+ }
+
+ @GetMapping("/{eventId}")
+ public EventFullDto getEventById(@PathVariable Long eventId, HttpServletRequest request) {
+ log.info("Public get event with eventId={} requested", eventId);
+ return eventService.getById(eventId, request);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/controller/EventSortBy.java b/main-service/src/main/java/ru/practicum/event/controller/EventSortBy.java
new file mode 100644
index 0000000..0ff03c7
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/controller/EventSortBy.java
@@ -0,0 +1,6 @@
+package ru.practicum.event.controller;
+
+public enum EventSortBy {
+ EVENT_DATE,
+ VIEWS
+}
diff --git a/main-service/src/main/java/ru/practicum/event/dto/NewEventDto.java b/main-service/src/main/java/ru/practicum/event/dto/NewEventDto.java
index 323e75f..1d9de92 100644
--- a/main-service/src/main/java/ru/practicum/event/dto/NewEventDto.java
+++ b/main-service/src/main/java/ru/practicum/event/dto/NewEventDto.java
@@ -2,16 +2,13 @@
import java.time.LocalDateTime;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.PositiveOrZero;
-import jakarta.validation.constraints.Size;
+import jakarta.validation.constraints.*;
public record NewEventDto(
@NotBlank @Size(min = 20, max = 2000) String annotation,
@NotNull Long category,
@NotBlank @Size(min = 20, max = 7000) String description,
- @NotNull LocalDateTime eventDate,
+ @NotNull @Future LocalDateTime eventDate,
@NotNull LocationDto location,
Boolean paid,
@PositiveOrZero Integer participantLimit,
diff --git a/main-service/src/main/java/ru/practicum/event/dto/UpdatableEvent.java b/main-service/src/main/java/ru/practicum/event/dto/UpdatableEvent.java
new file mode 100644
index 0000000..6c1b17c
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/dto/UpdatableEvent.java
@@ -0,0 +1,39 @@
+package ru.practicum.event.dto;
+
+import java.time.LocalDateTime;
+
+public interface UpdatableEvent {
+ boolean hasAnnotation();
+
+ String annotation();
+
+ boolean hasEventDate();
+
+ LocalDateTime eventDate();
+
+ boolean hasCategory();
+
+ boolean hasLocation();
+
+ LocationDto location();
+
+ boolean hasParticipantLimit();
+
+ Integer participantLimit();
+
+ boolean hasPaid();
+
+ Boolean paid();
+
+ boolean hasRequestModeration();
+
+ Boolean requestModeration();
+
+ boolean hasTitle();
+
+ String title();
+
+ boolean hasDescription();
+
+ String description();
+}
diff --git a/main-service/src/main/java/ru/practicum/event/dto/UpdateEventAdminRequest.java b/main-service/src/main/java/ru/practicum/event/dto/UpdateEventAdminRequest.java
index 23b0f72..c39faff 100644
--- a/main-service/src/main/java/ru/practicum/event/dto/UpdateEventAdminRequest.java
+++ b/main-service/src/main/java/ru/practicum/event/dto/UpdateEventAdminRequest.java
@@ -2,22 +2,24 @@
import java.time.LocalDateTime;
+import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.PositiveOrZero;
import jakarta.validation.constraints.Size;
-import ru.practicum.event.model.StateAction;
+import ru.practicum.event.model.AdminStateAction;
public record UpdateEventAdminRequest(
@Size(min = 20, max = 2000) String annotation,
Long category,
@Size(min = 20, max = 7000) String description,
- LocalDateTime eventDate,
+ @Future LocalDateTime eventDate,
LocationDto location,
Boolean paid,
@PositiveOrZero Integer participantLimit,
Boolean requestModeration,
- StateAction stateAction,
- @Size(min = 3, max = 120) String title) {
+ AdminStateAction stateAction,
+ @Size(min = 3, max = 120) String title)
+ implements UpdatableEvent {
public boolean hasAnnotation() {
return annotation != null && !annotation.isBlank();
diff --git a/main-service/src/main/java/ru/practicum/event/dto/UpdateEventUserRequest.java b/main-service/src/main/java/ru/practicum/event/dto/UpdateEventUserRequest.java
index 1c95bbd..82aee57 100644
--- a/main-service/src/main/java/ru/practicum/event/dto/UpdateEventUserRequest.java
+++ b/main-service/src/main/java/ru/practicum/event/dto/UpdateEventUserRequest.java
@@ -2,22 +2,24 @@
import java.time.LocalDateTime;
+import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.PositiveOrZero;
import jakarta.validation.constraints.Size;
-import ru.practicum.event.model.StateAction;
+import ru.practicum.event.model.UserStateAction;
public record UpdateEventUserRequest(
@Size(min = 20, max = 2000) String annotation,
Long category,
@Size(min = 20, max = 7000) String description,
- LocalDateTime eventDate,
+ @Future LocalDateTime eventDate,
LocationDto location,
Boolean paid,
@PositiveOrZero Integer participantLimit,
Boolean requestModeration,
- StateAction stateAction,
- @Size(min = 3, max = 120) String title) {
+ UserStateAction stateAction,
+ @Size(min = 3, max = 120) String title)
+ implements UpdatableEvent {
public boolean hasAnnotation() {
return annotation != null && !annotation.isBlank();
diff --git a/main-service/src/main/java/ru/practicum/event/mapper/EventMapper.java b/main-service/src/main/java/ru/practicum/event/mapper/EventMapper.java
new file mode 100644
index 0000000..4df4931
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/mapper/EventMapper.java
@@ -0,0 +1,136 @@
+package ru.practicum.event.mapper;
+
+import java.time.LocalDateTime;
+
+import ru.practicum.category.mapper.CategoryMapper;
+import ru.practicum.category.model.Category;
+import ru.practicum.event.dto.*;
+import ru.practicum.event.model.Event;
+import ru.practicum.event.model.EventState;
+import ru.practicum.event.model.Location;
+import ru.practicum.user.mapper.UserMapper;
+import ru.practicum.user.model.User;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class EventMapper {
+
+ public Event mapToEntity(
+ NewEventDto newEventDto, Category category, User initiator, Location location) {
+ return new Event(
+ null,
+ newEventDto.annotation(),
+ category,
+ LocalDateTime.now(),
+ newEventDto.description(),
+ newEventDto.eventDate(),
+ initiator,
+ location,
+ newEventDto.paid(),
+ newEventDto.participantLimit(),
+ null,
+ newEventDto.requestModeration(),
+ EventState.PENDING,
+ newEventDto.title());
+ }
+
+ public EventFullDto mapToFullDto(Event event, long confirmedRequests, Long views) {
+ return new EventFullDto(
+ event.getAnnotation(),
+ CategoryMapper.mapToDto(event.getCategory()),
+ confirmedRequests,
+ event.getCreatedOn(),
+ event.getDescription(),
+ event.getEventDate(),
+ event.getId(),
+ UserMapper.mapToUserShortDto(event.getInitiator()),
+ LocationMapper.mapToDto(event.getLocation()),
+ event.getPaid(),
+ event.getParticipantLimit(),
+ event.getPublishedOn(),
+ event.getRequestModeration(),
+ event.getState(),
+ event.getTitle(),
+ views);
+ }
+
+ public EventShortDto mapToShortDto(Event event, long confirmedRequests, Long views) {
+ return new EventShortDto(
+ event.getAnnotation(),
+ CategoryMapper.mapToDto(event.getCategory()),
+ confirmedRequests,
+ event.getEventDate(),
+ event.getId(),
+ UserMapper.mapToUserShortDto(event.getInitiator()),
+ event.getPaid(),
+ event.getTitle(),
+ views);
+ }
+
+ public void updateEventFromDto(
+ Event event, UpdateEventAdminRequest updateDto, Category newCategory) {
+ if (updateDto.hasStateAction()) {
+ switch (updateDto.stateAction()) {
+ case PUBLISH_EVENT -> {
+ event.setState(EventState.PUBLISHED);
+ event.setPublishedOn(LocalDateTime.now());
+ }
+ case REJECT_EVENT -> event.setState(EventState.CANCELED);
+ }
+ }
+
+ updateCommonFields(event, updateDto, newCategory);
+ }
+
+ public void updateEventFromDto(
+ Event event, UpdateEventUserRequest updateDto, Category newCategory) {
+ if (updateDto.hasStateAction()) {
+ switch (updateDto.stateAction()) {
+ case SEND_TO_REVIEW -> event.setState(EventState.PENDING);
+ case CANCEL_REVIEW -> event.setState(EventState.CANCELED);
+ }
+ }
+
+ updateCommonFields(event, updateDto, newCategory);
+ }
+
+ private void updateCommonFields(Event event, UpdatableEvent updateDto, Category newCategory) {
+ if (updateDto.hasAnnotation()) {
+ event.setAnnotation(updateDto.annotation());
+ }
+
+ if (updateDto.hasEventDate()) {
+ event.setEventDate(updateDto.eventDate());
+ }
+
+ if (updateDto.hasCategory()) {
+ event.setCategory(newCategory);
+ }
+
+ if (updateDto.hasLocation()) {
+ Location location = LocationMapper.mapToEntity(updateDto.location());
+ event.setLocation(location);
+ }
+
+ if (updateDto.hasParticipantLimit()) {
+ event.setParticipantLimit(updateDto.participantLimit());
+ }
+
+ if (updateDto.hasPaid()) {
+ event.setPaid(updateDto.paid());
+ }
+
+ if (updateDto.hasRequestModeration()) {
+ event.setRequestModeration(updateDto.requestModeration());
+ }
+
+ if (updateDto.hasTitle()) {
+ event.setTitle(updateDto.title());
+ }
+
+ if (updateDto.hasDescription()) {
+ event.setDescription(updateDto.description());
+ }
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/mapper/LocationMapper.java b/main-service/src/main/java/ru/practicum/event/mapper/LocationMapper.java
new file mode 100644
index 0000000..15472d9
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/mapper/LocationMapper.java
@@ -0,0 +1,18 @@
+package ru.practicum.event.mapper;
+
+import ru.practicum.event.dto.LocationDto;
+import ru.practicum.event.model.Location;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class LocationMapper {
+
+ public Location mapToEntity(LocationDto locationDto) {
+ return new Location(locationDto.lat(), locationDto.lon());
+ }
+
+ public LocationDto mapToDto(Location location) {
+ return new LocationDto(location.getLat(), location.getLon());
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/model/AdminStateAction.java b/main-service/src/main/java/ru/practicum/event/model/AdminStateAction.java
new file mode 100644
index 0000000..b6574b1
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/model/AdminStateAction.java
@@ -0,0 +1,6 @@
+package ru.practicum.event.model;
+
+public enum AdminStateAction {
+ PUBLISH_EVENT,
+ REJECT_EVENT
+}
diff --git a/main-service/src/main/java/ru/practicum/event/model/Event.java b/main-service/src/main/java/ru/practicum/event/model/Event.java
index 4b5eb7d..923ba49 100644
--- a/main-service/src/main/java/ru/practicum/event/model/Event.java
+++ b/main-service/src/main/java/ru/practicum/event/model/Event.java
@@ -24,7 +24,7 @@ public class Event {
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
- @Column(nullable = false)
+ @Column(nullable = false, length = 2000)
String annotation;
@ManyToOne(fetch = FetchType.LAZY)
@@ -34,7 +34,7 @@ public class Event {
@Column(nullable = false)
LocalDateTime createdOn;
- @Column(nullable = false)
+ @Column(nullable = false, length = 7000)
String description;
@Column(nullable = false)
@@ -61,6 +61,6 @@ public class Event {
@Column(nullable = false)
EventState state;
- @Column(nullable = false)
+ @Column(nullable = false, length = 120)
String title;
}
diff --git a/main-service/src/main/java/ru/practicum/event/model/EventState.java b/main-service/src/main/java/ru/practicum/event/model/EventState.java
index e7dc6de..9cfbb30 100644
--- a/main-service/src/main/java/ru/practicum/event/model/EventState.java
+++ b/main-service/src/main/java/ru/practicum/event/model/EventState.java
@@ -3,5 +3,5 @@
public enum EventState {
PENDING,
PUBLISHED,
- CANCELLED
+ CANCELED
}
diff --git a/main-service/src/main/java/ru/practicum/event/model/StateAction.java b/main-service/src/main/java/ru/practicum/event/model/UserStateAction.java
similarity index 71%
rename from main-service/src/main/java/ru/practicum/event/model/StateAction.java
rename to main-service/src/main/java/ru/practicum/event/model/UserStateAction.java
index 9019e86..114d5a7 100644
--- a/main-service/src/main/java/ru/practicum/event/model/StateAction.java
+++ b/main-service/src/main/java/ru/practicum/event/model/UserStateAction.java
@@ -1,6 +1,6 @@
package ru.practicum.event.model;
-public enum StateAction {
+public enum UserStateAction {
SEND_TO_REVIEW,
CANCEL_REVIEW
}
diff --git a/main-service/src/main/java/ru/practicum/event/repository/EventRepository.java b/main-service/src/main/java/ru/practicum/event/repository/EventRepository.java
new file mode 100644
index 0000000..c9917e8
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/repository/EventRepository.java
@@ -0,0 +1,89 @@
+package ru.practicum.event.repository;
+
+import java.time.LocalDateTime;
+import java.util.Optional;
+
+import ru.practicum.event.model.Event;
+import ru.practicum.event.model.EventState;
+import ru.practicum.event.model.QEvent;
+import ru.practicum.event.service.EventsAdminGetRequest;
+import ru.practicum.event.service.EventsPublicGetRequest;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+
+import com.querydsl.core.BooleanBuilder;
+import com.querydsl.core.types.Predicate;
+
+public interface EventRepository
+ extends JpaRepository, QuerydslPredicateExecutor {
+ static Predicate createPredicate(EventsAdminGetRequest request) {
+ QEvent event = QEvent.event;
+ BooleanBuilder builder = new BooleanBuilder();
+
+ if (request.hasUsers()) {
+ builder.and(event.initiator.id.in(request.users()));
+ }
+
+ if (request.hasStates()) {
+ builder.and(event.state.in(request.states()));
+ }
+
+ if (request.hasCategories()) {
+ builder.and(event.category.id.in(request.categories()));
+ }
+
+ if (request.hasRangeStart()) {
+ builder.and(event.eventDate.goe(request.rangeStart()));
+ }
+
+ if (request.hasRangeEnd()) {
+ builder.and(event.eventDate.loe(request.rangeEnd()));
+ }
+
+ return builder;
+ }
+
+ static Predicate createPredicate(EventsPublicGetRequest request) {
+ QEvent event = QEvent.event;
+ BooleanBuilder builder = new BooleanBuilder();
+
+ builder.and(event.state.eq(EventState.PUBLISHED));
+
+ if (request.hasPaid()) {
+ builder.and(event.paid.eq(request.paid()));
+ }
+
+ if (request.hasText()) {
+ String text = request.text();
+ builder.and(
+ event.annotation
+ .containsIgnoreCase(text)
+ .or(event.description.containsIgnoreCase(text)));
+ }
+
+ if (request.hasCategories()) {
+ builder.and(event.category.id.in(request.categories()));
+ }
+
+ if (request.hasRangeStart()) {
+ builder.and(event.eventDate.goe(request.rangeStart()));
+ }
+
+ if (request.hasRangeEnd()) {
+ builder.and(event.eventDate.loe(request.rangeEnd()));
+ }
+
+ if (!(request.hasRangeStart() && request.hasRangeEnd())) {
+ builder.and(event.eventDate.goe(LocalDateTime.now()));
+ }
+
+ return builder;
+ }
+
+ Optional findByIdAndState(Long id, EventState state);
+
+ Page findByInitiator_Id(Long initiatorId, Pageable pageable);
+}
diff --git a/main-service/src/main/java/ru/practicum/event/service/EventService.java b/main-service/src/main/java/ru/practicum/event/service/EventService.java
new file mode 100644
index 0000000..be8a801
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/service/EventService.java
@@ -0,0 +1,25 @@
+package ru.practicum.event.service;
+
+import java.util.Collection;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import ru.practicum.event.dto.*;
+
+public interface EventService {
+ EventFullDto getById(Long eventId, HttpServletRequest request);
+
+ Collection getEvents(EventsPublicGetRequest getRequest);
+
+ Collection getEvents(EventsAdminGetRequest getRequest);
+
+ Collection getEvents(EventsPrivateGetRequest getRequest);
+
+ EventFullDto createEvent(Long userId, NewEventDto newEventDto);
+
+ EventFullDto getByUserById(Long userId, Long eventId);
+
+ EventFullDto updateEvent(Long eventId, UpdateEventAdminRequest updateRequest);
+
+ EventFullDto updateEventByUser(Long userId, Long eventId, UpdateEventUserRequest updateRequest);
+}
diff --git a/main-service/src/main/java/ru/practicum/event/service/EventServiceImpl.java b/main-service/src/main/java/ru/practicum/event/service/EventServiceImpl.java
new file mode 100644
index 0000000..f5a456e
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/service/EventServiceImpl.java
@@ -0,0 +1,298 @@
+package ru.practicum.event.service;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.stream.Collectors;
+import java.util.*;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import ru.practicum.category.model.Category;
+import ru.practicum.category.repository.CategoryRepository;
+import ru.practicum.client.StatsClient;
+import ru.practicum.dto.ViewStatsDto;
+import ru.practicum.event.controller.EventSortBy;
+import ru.practicum.event.dto.*;
+import ru.practicum.event.mapper.EventMapper;
+import ru.practicum.event.mapper.LocationMapper;
+import ru.practicum.event.model.Event;
+import ru.practicum.event.model.EventState;
+import ru.practicum.event.model.Location;
+import ru.practicum.event.repository.EventRepository;
+import ru.practicum.exception.ForbiddenAccessException;
+import ru.practicum.exception.IllegalEventUpdateException;
+import ru.practicum.exception.NotFoundException;
+import ru.practicum.exception.ValidationException;
+import ru.practicum.user.model.User;
+import ru.practicum.user.repository.UserRepository;
+
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class EventServiceImpl implements EventService {
+ private static final Duration MIN_TIME_BEFORE_EVENT = Duration.ofHours(2);
+ private static final LocalDateTime MINIMAL_LOCAL_DATE_TIME =
+ LocalDateTime.of(1000, 1, 1, 0, 0, 0);
+ private static final LocalDateTime MAXIMUM_LOCAL_DATE_TIME =
+ LocalDateTime.of(9999, 1, 1, 0, 0, 0);
+ private static final String EVENTS_URI = "/events/%d";
+ private final EventRepository eventRepository;
+ private final UserRepository userRepository;
+ private final CategoryRepository categoryRepository;
+ private final StatsClient statsClient;
+
+ @Override
+ public EventFullDto getById(Long eventId, HttpServletRequest request) {
+ Optional eventOptional =
+ eventRepository.findByIdAndState(eventId, EventState.PUBLISHED);
+ Event event =
+ eventOptional.orElseThrow(
+ NotFoundException.supplier("Event with id=%d not found", eventId));
+
+ statsClient.hit(request);
+ String uri = request.getRequestURI();
+
+ ViewStatsDto statsDto = getStatsForEvent(event, uri);
+
+ return EventMapper.mapToFullDto(
+ event, 0, statsDto.hits()); // change 0 to actual number of requests
+ }
+
+ @Override
+ public Collection getEvents(EventsPublicGetRequest getRequest) {
+ Page events =
+ eventRepository.findAll(
+ EventRepository.createPredicate(getRequest), getRequest.getPageable());
+
+ statsClient.hit(getRequest.httpRequest());
+
+ LocalDateTime statsFrom =
+ getRequest.hasRangeStart() ? getRequest.rangeStart() : LocalDateTime.now();
+ LocalDateTime statsTo =
+ getRequest.hasRangeEnd() ? getRequest.rangeEnd() : MAXIMUM_LOCAL_DATE_TIME;
+
+ Map statsForEvents = getStatsMapForEvents(events, statsFrom, statsTo);
+
+ List eventsList =
+ events.stream()
+ .map(
+ event ->
+ EventMapper.mapToShortDto(
+ event,
+ 0,
+ statsForEvents.get(
+ event.getId()))) // change 0 to actual
+ // number of requests
+ .toList();
+
+ if (EventSortBy.VIEWS.equals(getRequest.sort())) {
+ return eventsList.stream().sorted(Comparator.comparing(EventShortDto::views)).toList();
+ }
+
+ return eventsList;
+ }
+
+ @Override
+ public Collection getEvents(EventsAdminGetRequest getRequest) {
+ Page events =
+ eventRepository.findAll(
+ EventRepository.createPredicate(getRequest), getRequest.getPageable());
+
+ Map statsForEvents =
+ getStatsMapForEvents(events, MINIMAL_LOCAL_DATE_TIME, MAXIMUM_LOCAL_DATE_TIME);
+
+ return events.stream()
+ .map(
+ event ->
+ EventMapper.mapToFullDto(
+ event,
+ 0,
+ statsForEvents.get(
+ event.getId()))) // change 0 to actual number of
+ // requests
+ .toList();
+ }
+
+ @Override
+ public Collection getEvents(EventsPrivateGetRequest getRequest) {
+ getUserByIdOrThrow(getRequest.userId());
+ Page events =
+ eventRepository.findByInitiator_Id(getRequest.userId(), getRequest.getPageable());
+
+ Map statsForEvents =
+ getStatsMapForEvents(events, MINIMAL_LOCAL_DATE_TIME, MAXIMUM_LOCAL_DATE_TIME);
+
+ return events.stream()
+ .map(
+ event ->
+ EventMapper.mapToShortDto(
+ event,
+ 0,
+ statsForEvents.get(
+ event.getId()))) // change 0 to actual number of
+ // requests
+ .toList();
+ }
+
+ @Override
+ @Transactional
+ public EventFullDto createEvent(Long userId, NewEventDto newEventDto) {
+ Location location = LocationMapper.mapToEntity(newEventDto.location());
+ Category category = getCategoryByIdOrThrow(newEventDto.category());
+ User initiator = getUserByIdOrThrow(userId);
+ Event event = EventMapper.mapToEntity(newEventDto, category, initiator, location);
+
+ LocalDateTime now = LocalDateTime.now();
+ if (event.getEventDate().isBefore(now.plus(MIN_TIME_BEFORE_EVENT))) {
+ throw new ValidationException(
+ "The event must be scheduled at least %d hours from now."
+ .formatted(MIN_TIME_BEFORE_EVENT.toHours()));
+ }
+ Event saved = eventRepository.save(event);
+
+ return EventMapper.mapToFullDto(saved, 0, 0L);
+ }
+
+ @Override
+ public EventFullDto getByUserById(Long userId, Long eventId) {
+ User user = getUserByIdOrThrow(userId);
+
+ Event event = getEventByIdOrThrow(eventId);
+
+ if (!event.getInitiator().getId().equals(user.getId())) {
+ throw new ForbiddenAccessException("You can't view event that's not yours");
+ }
+
+ ViewStatsDto statsDto = getStatsForEvent(event, EVENTS_URI.formatted(eventId));
+
+ return EventMapper.mapToFullDto(
+ event, 0, statsDto.hits()); // change 0 to actual number of requests
+ }
+
+ @Override
+ @Transactional
+ public EventFullDto updateEvent(Long eventId, UpdateEventAdminRequest updateRequest) {
+ Event event = getEventByIdOrThrow(eventId);
+
+ if ((event.getState().equals(EventState.PUBLISHED)
+ || event.getState().equals(EventState.CANCELED))
+ && updateRequest.hasStateAction()) {
+ throw new IllegalEventUpdateException(
+ "Forbidden to update event that already %s"
+ .formatted(event.getState().toString()));
+ }
+
+ Category newCategory = null;
+ if (updateRequest.hasCategory()) {
+ newCategory = getCategoryByIdOrThrow(updateRequest.category());
+ }
+ EventMapper.updateEventFromDto(event, updateRequest, newCategory);
+
+ Event saved = eventRepository.save(event);
+
+ return EventMapper.mapToFullDto(saved, 0, null); // change 0 to actual number of requests
+ }
+
+ @Override
+ @Transactional
+ public EventFullDto updateEventByUser(
+ Long userId, Long eventId, UpdateEventUserRequest updateRequest) {
+ Event event = getEventByIdOrThrow(eventId);
+ User user = getUserByIdOrThrow(userId);
+
+ if (!event.getInitiator().getId().equals(user.getId())) {
+ throw new ForbiddenAccessException("You can't update event that's not yours");
+ }
+
+ if ((event.getState().equals(EventState.PUBLISHED)
+ || event.getState().equals(EventState.CANCELED))
+ && !updateRequest.hasStateAction()) {
+ throw new IllegalEventUpdateException(
+ "Forbidden to update event that already %s"
+ .formatted(event.getState().toString()));
+ }
+
+ Category newCategory = null;
+ if (updateRequest.hasCategory()) {
+ newCategory = getCategoryByIdOrThrow(updateRequest.category());
+ }
+ EventMapper.updateEventFromDto(event, updateRequest, newCategory);
+
+ Event saved = eventRepository.save(event);
+
+ return EventMapper.mapToFullDto(saved, 0, null); // change 0 to actual number of requests
+ }
+
+ private Map getStatsMapForEvents(
+ Page events, LocalDateTime from, LocalDateTime to) {
+ List listOfUris =
+ events.stream().map(event -> EVENTS_URI.formatted(event.getId())).toList();
+ return getStatsForEvents(listOfUris, from, to).stream()
+ .collect(
+ Collectors.toMap(
+ statsDto ->
+ Long.valueOf(
+ statsDto.uri()
+ .substring(
+ statsDto.uri().lastIndexOf('/')
+ + 1)),
+ ViewStatsDto::hits));
+ }
+
+ private List getStatsForEvents(
+ List uris, LocalDateTime from, LocalDateTime to) {
+ try {
+ return statsClient.getStats(from, to, uris, true);
+ } catch (Exception e) {
+ log.error("Error during getting stats for events", e);
+ }
+ return List.of();
+ }
+
+ private ViewStatsDto getStatsForEvent(Event event, String uri) {
+ ViewStatsDto statsDto;
+ try {
+ statsDto =
+ statsClient
+ .getStats(
+ MINIMAL_LOCAL_DATE_TIME,
+ MAXIMUM_LOCAL_DATE_TIME,
+ List.of(uri),
+ true)
+ .getFirst();
+ } catch (NoSuchElementException e) {
+ log.trace("No stats for event with id={} found", event.getId());
+ statsDto = new ViewStatsDto(null, null, 0L);
+ } catch (Exception e) {
+ log.error("Error during getting stats for event with id={}", event.getId(), e);
+ statsDto = new ViewStatsDto(null, null, null);
+ }
+ return statsDto;
+ }
+
+ private Event getEventByIdOrThrow(Long eventId) {
+ Optional eventOptional = eventRepository.findById(eventId);
+ return eventOptional.orElseThrow(
+ NotFoundException.supplier("Event with id=%d not found", eventId));
+ }
+
+ private User getUserByIdOrThrow(Long userId) {
+ Optional optionalUser = userRepository.findById(userId);
+ return optionalUser.orElseThrow(
+ NotFoundException.supplier("User with id=%d not found", userId));
+ }
+
+ private Category getCategoryByIdOrThrow(Long categoryId) {
+ Optional optionalCategory = categoryRepository.findById(categoryId);
+ return optionalCategory.orElseThrow(
+ NotFoundException.supplier("Category with id=%d not found", categoryId));
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/service/EventsAdminGetRequest.java b/main-service/src/main/java/ru/practicum/event/service/EventsAdminGetRequest.java
new file mode 100644
index 0000000..18bd132
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/service/EventsAdminGetRequest.java
@@ -0,0 +1,44 @@
+package ru.practicum.event.service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import ru.practicum.event.model.EventState;
+
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+
+public record EventsAdminGetRequest(
+ List users,
+ List states,
+ List categories,
+ LocalDateTime rangeStart,
+ LocalDateTime rangeEnd,
+ int from,
+ int size) {
+
+ public boolean hasUsers() {
+ return users != null && !users.isEmpty();
+ }
+
+ public boolean hasStates() {
+ return states != null && !states.isEmpty();
+ }
+
+ public boolean hasCategories() {
+ return categories != null && !categories.isEmpty();
+ }
+
+ public boolean hasRangeStart() {
+ return rangeStart != null;
+ }
+
+ public boolean hasRangeEnd() {
+ return rangeEnd != null;
+ }
+
+ public Pageable getPageable() {
+ int page = from / size;
+ return PageRequest.of(page, size);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/service/EventsPrivateGetRequest.java b/main-service/src/main/java/ru/practicum/event/service/EventsPrivateGetRequest.java
new file mode 100644
index 0000000..3df3186
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/service/EventsPrivateGetRequest.java
@@ -0,0 +1,12 @@
+package ru.practicum.event.service;
+
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+
+public record EventsPrivateGetRequest(Long userId, int from, int size) {
+
+ public Pageable getPageable() {
+ int page = from / size;
+ return PageRequest.of(page, size);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/event/service/EventsPublicGetRequest.java b/main-service/src/main/java/ru/practicum/event/service/EventsPublicGetRequest.java
new file mode 100644
index 0000000..b4a8cfa
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/event/service/EventsPublicGetRequest.java
@@ -0,0 +1,57 @@
+package ru.practicum.event.service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import ru.practicum.event.controller.EventSortBy;
+
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+public record EventsPublicGetRequest(
+ String text,
+ List categories,
+ Boolean paid,
+ LocalDateTime rangeStart,
+ LocalDateTime rangeEnd,
+ boolean onlyAvailable,
+ EventSortBy sort,
+ int from,
+ int size,
+ HttpServletRequest httpRequest) {
+
+ public boolean hasText() {
+ return text != null && !text.isEmpty();
+ }
+
+ public boolean hasCategories() {
+ return categories != null && !categories.isEmpty();
+ }
+
+ public boolean hasPaid() {
+ return paid != null;
+ }
+
+ public boolean hasRangeStart() {
+ return rangeStart != null;
+ }
+
+ public boolean hasRangeEnd() {
+ return rangeEnd != null;
+ }
+
+ public boolean hasSortBy() {
+ return sort != null;
+ }
+
+ public Pageable getPageable() {
+ int page = from / size;
+ if (EventSortBy.EVENT_DATE.equals(sort)) {
+ return PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "eventDate"));
+ }
+ return PageRequest.of(page, size);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/exception/ForbiddenAccessException.java b/main-service/src/main/java/ru/practicum/exception/ForbiddenAccessException.java
new file mode 100644
index 0000000..1e7f8b5
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/exception/ForbiddenAccessException.java
@@ -0,0 +1,7 @@
+package ru.practicum.exception;
+
+public class ForbiddenAccessException extends RuntimeException {
+ public ForbiddenAccessException(String message) {
+ super(message);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/exception/IllegalEventUpdateException.java b/main-service/src/main/java/ru/practicum/exception/IllegalEventUpdateException.java
new file mode 100644
index 0000000..7e961c7
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/exception/IllegalEventUpdateException.java
@@ -0,0 +1,7 @@
+package ru.practicum.exception;
+
+public class IllegalEventUpdateException extends RuntimeException {
+ public IllegalEventUpdateException(String message) {
+ super(message);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/exception/ValidationException.java b/main-service/src/main/java/ru/practicum/exception/ValidationException.java
new file mode 100644
index 0000000..d751d21
--- /dev/null
+++ b/main-service/src/main/java/ru/practicum/exception/ValidationException.java
@@ -0,0 +1,7 @@
+package ru.practicum.exception;
+
+public class ValidationException extends RuntimeException {
+ public ValidationException(String message) {
+ super(message);
+ }
+}
diff --git a/main-service/src/main/java/ru/practicum/exception/handler/GlobalExceptionHandler.java b/main-service/src/main/java/ru/practicum/exception/handler/GlobalExceptionHandler.java
index 78bf9c7..bf746af 100644
--- a/main-service/src/main/java/ru/practicum/exception/handler/GlobalExceptionHandler.java
+++ b/main-service/src/main/java/ru/practicum/exception/handler/GlobalExceptionHandler.java
@@ -8,7 +8,10 @@
import jakarta.validation.ConstraintViolationException;
+import ru.practicum.exception.ForbiddenAccessException;
+import ru.practicum.exception.IllegalEventUpdateException;
import ru.practicum.exception.NotFoundException;
+import ru.practicum.exception.ValidationException;
import ru.practicum.exception.dto.ApiError;
import ru.practicum.exception.dto.Violation;
@@ -85,7 +88,7 @@ public ApiError handleMethodArgumentNotValidException(MethodArgumentNotValidExce
public ApiError handleNotFoundException(NotFoundException e) {
log.warn("Not found: {}", e.getMessage());
return new ApiError(
- List.of(e.getMessage()),
+ null,
e.getMessage(),
"The required object was not found",
HttpStatus.NOT_FOUND.toString(),
@@ -97,10 +100,46 @@ public ApiError handleNotFoundException(NotFoundException e) {
public ApiError handleDataIntegrityViolationException(DataIntegrityViolationException e) {
log.warn(e.getMessage(), e);
return new ApiError(
- List.of(e.getMessage()),
+ null,
e.getMessage(),
"Some fields of RequestBody for request are invalid",
HttpStatus.NOT_FOUND.toString(),
LocalDateTime.now());
}
+
+ @ResponseStatus(HttpStatus.CONFLICT)
+ @ExceptionHandler(IllegalEventUpdateException.class)
+ public ApiError handleIllegalEventUpdateException(IllegalEventUpdateException e) {
+ log.warn(e.getMessage(), e);
+ return new ApiError(
+ null,
+ e.getMessage(),
+ "Trying to update event that already Published or Canceled",
+ HttpStatus.CONFLICT.toString(),
+ LocalDateTime.now());
+ }
+
+ @ResponseStatus(HttpStatus.FORBIDDEN)
+ @ExceptionHandler(ForbiddenAccessException.class)
+ public ApiError handleForbiddenAccessException(ForbiddenAccessException e) {
+ log.warn(e.getMessage(), e);
+ return new ApiError(
+ null,
+ e.getMessage(),
+ "Forbidden",
+ HttpStatus.FORBIDDEN.toString(),
+ LocalDateTime.now());
+ }
+
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(ValidationException.class)
+ public ApiError handleValidationException(ValidationException e) {
+ log.warn(e.getMessage(), e);
+ return new ApiError(
+ null,
+ e.getMessage(),
+ "Incorrect request",
+ HttpStatus.BAD_REQUEST.toString(),
+ LocalDateTime.now());
+ }
}
diff --git a/main-service/src/main/resources/application-dev.yaml b/main-service/src/main/resources/application-dev.yaml
index 06e3952..0c0b25f 100644
--- a/main-service/src/main/resources/application-dev.yaml
+++ b/main-service/src/main/resources/application-dev.yaml
@@ -4,6 +4,7 @@ server:
stats-server:
url: http://localhost:9090
app: ${STATS_SERVER_APP:ewm-main-service}
+
spring:
application:
name: ewm-service
@@ -25,3 +26,10 @@ spring:
sql:
init:
mode: embedded
+logging:
+ level:
+ org:
+ hibernate:
+ orm:
+ jdbc:
+ bind: trace
diff --git a/pom.xml b/pom.xml
index bf1fdc6..268da56 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,8 +25,19 @@
21
UTF-8
+ 5.1.0
+
+
+
+ com.querydsl
+ querydsl-jpa
+ ${querydsl.version}
+ jakarta
+
+
+
diff --git a/postman/ewm-main-service.json b/postman/ewm-main-service.json
index 6fd7223..9c84a28 100644
--- a/postman/ewm-main-service.json
+++ b/postman/ewm-main-service.json
@@ -1,27 +1,23 @@
{
"info": {
- "_postman_id": "f778b13b-bd02-4617-8fae-282f672abb17",
- "name": "Test Explore With Me - Main service",
+ "_postman_id": "788f4375-147e-4e45-ab6d-7baa8e542674",
+ "name": "Test Explore With Me - Main service Copy",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_exporter_id": "27311667",
- "_collection_link": "https://api555-4802.postman.co/workspace/explore-with-me~26332bb9-fe8e-403d-8af2-e0d94c187194/collection/27311667-f778b13b-bd02-4617-8fae-282f672abb17?action=share&source=collection_link&creator=27311667"
+ "_collection_link": "https://api555-4802.postman.co/workspace/explore-with-me~26332bb9-fe8e-403d-8af2-e0d94c187194/collection/27311667-788f4375-147e-4e45-ab6d-7baa8e542674?action=share&source=collection_link&creator=27311667"
},
"item": [
{
"name": "Validation",
"item": [
{
- "name": "Users",
+ "name": "Event",
"item": [
- {
- "name": "Required query params",
- "item": []
- },
{
"name": "Unrequired query params",
"item": [
{
- "name": "Поиск пользователей без нескольких Query params",
+ "name": "Получение событий, добавленных текущим пользователем без нескольких Query params",
"event": [
{
"listen": "prerequest",
@@ -31,10 +27,11 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let compilation;\r",
" try {\r",
" const user = await api.addUser(rnd.getUser());\r",
" pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -81,20 +78,16 @@
}
],
"url": {
- "raw": "{{baseUrl}}/admin/users?ids={{uid}}",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
],
"query": [
- {
- "key": "ids",
- "value": "{{uid}}",
- "description": "id пользователей"
- },
{
"key": "from",
"value": "0",
@@ -103,17 +96,24 @@
},
{
"key": "size",
- "value": "10",
+ "value": "1000",
"description": "количество элементов в наборе",
"disabled": true
}
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
}
},
"response": []
},
{
- "name": "Поиск пользователей без параметра ids",
+ "name": "Получение событий с возможностью фильтрации без нескольких Query params",
"event": [
{
"listen": "prerequest",
@@ -123,17 +123,13 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let compilation;\r",
" try {\r",
- " let user1 = rnd.getUser();\r",
- " user1 = await api.addUser(user1);\r",
- "\r",
- " let user2 = rnd.getUser()\r",
- " user2 = await api.addUser(user2);\r",
- " //pm.collectionVariables.set('fromId', user1.id);\r",
- " pm.collectionVariables.set('source1', user1);\r",
- " pm.collectionVariables.set('source2', user2);\r",
- "\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.request.removeQueryParams(['text', 'categories', 'paid']);\r",
+ " pm.request.addQueryParams([`text=` + event.annotation, 'categories=' + category.id, 'paid=' + event.paid]);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -144,6 +140,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -165,30 +162,7 @@
" pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
- "});\r",
- "\r",
- "const target = pm.response.json();\r",
- "const source1 = pm.collectionVariables.get('source1');\r",
- "const source2 = pm.collectionVariables.get('source2');\r",
- "\r",
- "pm.test(\"Пользователи должны содержать поля: id, name, email\", function () {\r",
- " pm.expect(target[target.length-2]).to.have.property('id');\r",
- " pm.expect(target[target.length-2]).to.have.property('name');\r",
- " pm.expect(target[target.length-2]).to.have.property('email');\r",
- " pm.expect(target[target.length-1]).to.have.property('id');\r",
- " pm.expect(target[target.length-1]).to.have.property('name');\r",
- " pm.expect(target[target.length-1]).to.have.property('email');\r",
- "});\r",
- "\r",
- "pm.test(\"Данные последних двух пользователей должны совпадать с данными добавленных пользователей\", function () {\r",
- " pm.expect(target[target.length-2].id).to.equal(source1.id);\r",
- " pm.expect(target[target.length-2].name).to.equal(source1.name);\r",
- " pm.expect(target[target.length-2].email).to.equal(source1.email);\r",
- " pm.expect(target[target.length-1].id).to.equal(source2.id);\r",
- " pm.expect(target[target.length-1].name).to.equal(source2.name);\r",
- " pm.expect(target[target.length-1].email).to.equal(source2.email);\r",
- "});\r",
- ""
+ "});"
],
"type": "text/javascript"
}
@@ -203,33 +177,71 @@
}
],
"url": {
- "raw": "{{baseUrl}}/admin/users?from={{fromId}}&size=100000",
+ "raw": "{{baseUrl}}/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "events"
],
"query": [
{
- "key": "ids",
- "value": "{{uid}}",
- "description": "id пользователей",
+ "key": "text",
+ "value": "0",
+ "description": "текст для поиска в содержимом аннотации и подробном описании события",
+ "disabled": true
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список идентификаторов категорий в которых будет вестись поиск",
+ "disabled": true
+ },
+ {
+ "key": "paid",
+ "value": "true",
+ "description": "поиск только платных/бесплатных событий",
+ "disabled": true
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "onlyAvailable",
+ "value": "false",
+ "description": "только события у которых не исчерпан лимит запросов на участие",
+ "disabled": true
+ },
+ {
+ "key": "sort",
+ "value": "EVENT_DATE",
+ "description": "Вариант сортировки: по дате события или по количеству просмотров",
"disabled": true
},
{
"key": "from",
- "value": "{{fromId}}",
- "description": "количество элементов, которые нужно пропустить для формирования текущего набора"
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
},
{
"key": "size",
- "value": "100000",
- "description": "количество элементов в наборе"
+ "value": "1000",
+ "description": "количество событий в наборе",
+ "disabled": true
}
]
- }
+ },
+ "description": "Обратите внимание: \n- это публичный эндпоинт, соответственно в выдаче должны быть только опубликованные события\n- текстовый поиск (по аннотации и подробному описанию) должен быть без учета регистра букв\n- если в запросе не указан диапазон дат [rangeStart-rangeEnd], то нужно выгружать события, которые произойдут позже текущей даты и времени\n- информация о каждом событии должна включать в себя количество просмотров и количество уже одобренных заявок на участие\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
}
@@ -239,7 +251,7 @@
"name": "Required params in body",
"item": [
{
- "name": "Добавление пользователя с электронной почтой, состоящей только из пробелов",
+ "name": "Добавление события без поля description",
"event": [
{
"listen": "prerequest",
@@ -249,17 +261,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = \" \";\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " delete event[\"description\"];\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -286,9 +300,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -316,20 +333,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с пустой электронной почтой",
+ "name": "Добавление события с пустым описанием",
"event": [
{
"listen": "prerequest",
@@ -339,17 +365,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = \"\";\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event[\"description\"] = '';\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -376,9 +404,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -406,20 +437,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя без поля email",
+ "name": "Добавление события со строкой из пробелов в качестве описания",
"event": [
{
"listen": "prerequest",
@@ -429,17 +469,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " delete user.email;\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event[\"description\"] = ' ';\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -466,9 +508,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -496,20 +541,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с пустым именем",
+ "name": "Добавление события без поля annotation",
"event": [
{
"listen": "prerequest",
@@ -519,17 +573,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = \"\";\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " delete event[\"annotation\"];\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -556,9 +612,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -586,20 +645,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с именем, состоящим только из пробелов",
+ "name": "Добавление события с пустой аннотацией",
"event": [
{
"listen": "prerequest",
@@ -609,17 +677,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = \" \";\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event[\"annotation\"] = '';\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -646,9 +716,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -676,20 +749,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя без поля name",
+ "name": "Добавление события со строкой из пробелов в качестве аннотации",
"event": [
{
"listen": "prerequest",
@@ -699,17 +781,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " delete user.name;\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event[\"annotation\"] = ' ';\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -736,9 +820,12 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
- " pm.response.to.have.status(400);\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
],
"type": "text/javascript"
}
@@ -766,29 +853,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- }
- ]
- },
- {
- "name": "Misc tests",
- "item": []
- },
- {
- "name": "String length restrictions",
- "item": [
+ },
{
- "name": "Добавление пользователя с name.length < 2",
+ "name": "Добавление события с отрицательным лимитом участников",
"event": [
{
"listen": "prerequest",
@@ -798,17 +885,19 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = rnd.getWord(1);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event[\"participantLimit\"] = -6;\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -868,20 +957,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с name.length == 2",
+ "name": "Изменение события добавленного текущим пользователем. Изменение лимита участников на отрицательное значение",
"event": [
{
"listen": "prerequest",
@@ -891,19 +989,23 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = rnd.getWord(2);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.collectionVariables.set(\"response\", event);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " participantLimit : -156\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -928,8 +1030,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(400);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -940,7 +1042,7 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
{
"key": "Content-Type",
@@ -961,20 +1063,40 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
]
- }
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
},
"response": []
- },
+ }
+ ]
+ },
+ {
+ "name": "Misc tests",
+ "item": [
{
- "name": "Добавление пользователя с name.length > 250",
+ "name": "Отклонение публикации события",
"event": [
{
"listen": "prerequest",
@@ -984,19 +1106,34 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let new_event, event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = rnd.getWord(251);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " await pm.sendRequest({\r",
+ " url : \"http://localhost:8080/admin/events/\" + event.id,\r",
+ " method : \"PATCH\",\r",
+ " header: { \"Content-Type\": \"application/json\" },\r",
+ " body: JSON.stringify({\r",
+ " stateAction: \"REJECT_EVENT\"\r",
+ " })\r",
+ " }, (error, response) => {\r",
+ "\r",
+ " });\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.collectionVariables.set(\"response\", event);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " stateAction: \"SEND_TO_REVIEW\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1021,19 +1158,53 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
- " pm.response.to.be.badRequest; \r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
- ""
+ "\r",
+ "const source = pm.collectionVariables.get(\"response\");\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, description, participantLimit, state, createdOn, location, requestModeration\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация отменённого события должна соответствовать аннотации события до отмены');\r",
+ " pm.expect(source.category.id).equal(target.category.id, 'Категория отменённого события должна соответствовать категории события до отмены');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость отменённого события должна соответствовать стоимости события до отмены');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения отменённого события должна соответствовать дате проведения события до отмены');\r",
+ " pm.expect(source.description).equal(target.description, 'Описание отменённого события должно соответствовать описанию события до отмены');\r",
+ " pm.expect(source.title).equal(target.title, 'Название отменённого события должно соответствовать названию события до отмены');\r",
+ " pm.expect(source.participantLimit.toString()).equal(target.participantLimit.toString(), 'Лимит участников отменённого события должен соответствовать лимиту участников события до отмены');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость отменённого события должна соответствовать стоимости события до отмены');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Событие должно иметь статус CANCELED при возвращении от администратора и статус PENDING после выполнения запроса\", function () {\r",
+ " pm.expect(target.state).equal(\"PENDING\");\r",
+ "});"
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
{
"key": "Content-Type",
@@ -1054,20 +1225,35 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
]
- }
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
},
"response": []
},
{
- "name": "Добавление пользователя с name.length == 250",
+ "name": "Попытка получения информации о событии по публичному эндпоинту без публикации",
"event": [
{
"listen": "prerequest",
@@ -1077,19 +1263,15 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.name = rnd.getWord(250);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.collectionVariables.set('response', event);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1097,6 +1279,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -1114,8 +1297,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 404 и данные в формате json\", function () {\r",
+ " pm.response.to.be.notFound; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -1126,41 +1309,36 @@
}
],
"request": {
- "method": "POST",
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/events/:id",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "events",
+ ":id"
+ ],
+ "variable": [
+ {
+ "key": "id",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
]
- }
+ },
+ "description": "Обратите внимание:\n- событие должно быть опубликовано\n- информация о событии должна включать в себя количество просмотров и количество подтвержденных запросов\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
},
{
- "name": "Добавление пользователя с email.length < 6",
+ "name": "Получение событий с возможностью фильтрации и проверкой на валидацию",
"event": [
{
"listen": "prerequest",
@@ -1170,19 +1348,11 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@a.r';\r",
+ " \r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1190,6 +1360,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -1211,49 +1382,82 @@
" pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
- "});\r",
- ""
+ "});"
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "POST",
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/events?text=0&categories=0&paid=true&rangeStart=2022-01-06%2013%3A30%3A38&rangeEnd=2007-09-06%2013%3A30%3A38&onlyAvailable=false&sort=EVENT_DATE&from=0&size=1000",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "events"
+ ],
+ "query": [
+ {
+ "key": "text",
+ "value": "0",
+ "description": "текст для поиска в содержимом аннотации и подробном описании события"
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список идентификаторов категорий в которых будет вестись поиск"
+ },
+ {
+ "key": "paid",
+ "value": "true",
+ "description": "поиск только платных/бесплатных событий"
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие"
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2007-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие"
+ },
+ {
+ "key": "onlyAvailable",
+ "value": "false",
+ "description": "только события у которых не исчерпан лимит запросов на участие"
+ },
+ {
+ "key": "sort",
+ "value": "EVENT_DATE",
+ "description": "Вариант сортировки: по дате события или по количеству просмотров"
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе"
+ }
]
- }
+ },
+ "description": "Обратите внимание: \n- это публичный эндпоинт, соответственно в выдаче должны быть только опубликованные события\n- текстовый поиск (по аннотации и подробному описанию) должен быть без учета регистра букв\n- если в запросе не указан диапазон дат [rangeStart-rangeEnd], то нужно выгружать события, которые произойдут позже текущей даты и времени\n- информация о каждом событии должна включать в себя количество просмотров и количество уже одобренных заявок на участие\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
},
{
- "name": "Добавление пользователя с email.length == 6",
+ "name": "Проверка работы поля views",
"event": [
{
"listen": "prerequest",
@@ -1263,19 +1467,17 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@a.ru';\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " await api.findEvent(event.id)\r",
+ " await api.findEvent(event.id)\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1283,6 +1485,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -1300,53 +1503,74 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
- ""
+ "\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('views');\r",
+ "pm.expect(target).to.have.property('confirmedRequests');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('publishedOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Значение поля views должно увеличится на 1 после выполнения GET запроса с уникального IP к событию\", function () {\r",
+ " pm.expect(target.views).equal(1);\r",
+ " \r",
+ "});"
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "POST",
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/events/:id",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "events",
+ ":id"
+ ],
+ "variable": [
+ {
+ "key": "id",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
]
- }
+ },
+ "description": "Обратите внимание:\n- событие должно быть опубликовано\n- информация о событии должна включать в себя количество просмотров и количество подтвержденных запросов\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
},
{
- "name": "Добавление пользователя с email.localpart.length > 64",
+ "name": "Изменение даты события на уже наступившую",
"event": [
{
"listen": "prerequest",
@@ -1356,19 +1580,21 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(65) + '@a.ru';\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " eventDate : \"2020-10-11 23:10:05\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1376,6 +1602,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -1394,10 +1621,11 @@
"script": {
"exec": [
"pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
- " pm.response.to.be.badRequest; \r",
+ " pm.response.to.have.status(400);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
+ "\r",
""
],
"type": "text/javascript"
@@ -1405,12 +1633,8 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
@@ -1418,28 +1642,32 @@
],
"body": {
"mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
+ "raw": "{{request_body}}"
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "users"
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
]
- }
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
},
{
- "name": "Добавление пользователя с email.localpart.length == 64",
+ "name": "Изменение события добавленного текущим пользователем. Изменение даты не неподходящую",
"event": [
{
"listen": "prerequest",
@@ -1449,19 +1677,23 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(59) + '@a.ru';\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.collectionVariables.set(\"response\", event);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " eventDate : \"2020-10-11 23:10:05\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1486,8 +1718,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(400);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -1498,7 +1730,7 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
{
"key": "Content-Type",
@@ -1519,20 +1751,35 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
]
- }
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
},
"response": []
},
{
- "name": "Добавление пользователя с domain.part.length > 63",
+ "name": "Добавление события на неподходящую дату",
"event": [
{
"listen": "prerequest",
@@ -1542,17 +1789,20 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@' + rnd.getWord(64) + '.ru';\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.eventDate = \"2020-12-31 15:10:05\";\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -1580,7 +1830,7 @@
"script": {
"exec": [
"pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
- " pm.response.to.be.badRequest; \r",
+ " pm.response.to.have.status(400);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -1612,20 +1862,34 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- },
+ }
+ ]
+ },
+ {
+ "name": "String length restrictions",
+ "item": [
{
- "name": "Добавление пользователя с domain.part.length == 63",
+ "name": "Добавление нового события с description.length < 20",
"event": [
{
"listen": "prerequest",
@@ -1635,17 +1899,20 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@' + rnd.getWord(60) + '.ru';\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.description = rnd.getWord(19);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -1672,8 +1939,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -1705,20 +1972,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с email.length > 254",
+ "name": "Добавление нового события с description.length < 20",
"event": [
{
"listen": "prerequest",
@@ -1728,17 +2004,20 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(61);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.description = rnd.getWord(19);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -1798,20 +2077,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление пользователя с email.length == 254",
+ "name": "Добавление нового события с annotation.length < 20",
"event": [
{
"listen": "prerequest",
@@ -1821,17 +2109,20 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
+ " let event;\r",
" try {\r",
- " user = rnd.getUser();\r",
- " user.email = rnd.getWord(1) + '@' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(60);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.annotation = rnd.getWord(19);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -1858,8 +2149,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -1891,25 +2182,29 @@
}
},
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- }
- ]
- },
- {
- "name": "Default values check",
- "item": [
+ },
{
- "name": "Проверка на значения по-умолчанию from и size(user)",
+ "name": "Добавление нового события с annotation.length > 2000",
"event": [
{
"listen": "prerequest",
@@ -1919,18 +2214,22 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
+ " let event;\r",
" try {\r",
- " for (let i = 0; i < 11; i++){\r",
- " await api.addUser(rnd.getUser());\r",
- " }\r",
- " await pm.sendRequest({\r",
- " url : \"http://localhost:8080/admin/users?from=0\",\r",
- " method : \"GET\",\r",
- " header: { \"Content-Type\": \"application/json\" }\r",
- " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.annotation = rnd.getWord(2001);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(event),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -1955,22 +2254,11 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.be.ok; \r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
- "\r",
- "const target = pm.response.json();\r",
- "const source = pm.collectionVariables.get('source');\r",
- "\r",
- "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
- " pm.expect(target[0].id).to.be.equal(source[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
- "});\r",
- "\r",
- "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
- " pm.expect(target.length).to.be.equal(10);\r",
- "});\r",
""
],
"type": "text/javascript"
@@ -1978,133 +2266,50 @@
}
],
"request": {
- "method": "GET",
+ "method": "POST",
"header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
{
"key": "Accept",
"value": "application/json"
}
],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
],
- "query": [
+ "variable": [
{
- "key": "ids",
+ "key": "userId",
"value": "{{uid}}",
- "description": "id пользователей",
- "disabled": true
- },
- {
- "key": "ids",
- "value": "-10833646",
- "description": "id пользователей",
- "disabled": true
- },
- {
- "key": "from",
- "value": "0",
- "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
- "disabled": true
- },
- {
- "key": "size",
- "value": "10",
- "description": "количество элементов в наборе",
- "disabled": true
+ "description": "(Required) id текущего пользователя"
}
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- }
- ]
- }
- ]
- },
- {
- "name": "Category",
- "item": [
- {
- "name": "Required query params",
- "item": []
- },
- {
- "name": "Unrequired params in body",
- "item": [
+ },
{
- "name": "Получение категорий без нескольких Query params",
- "event": [
- {
- "listen": "prerequest",
- "script": {
- "exec": [
- ""
- ],
- "type": "text/javascript"
- }
- },
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.be.ok; \r",
- " pm.response.to.be.withBody;\r",
- " pm.response.to.be.json;\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Accept",
- "value": "application/json"
- }
- ],
- "url": {
- "raw": "{{baseUrl}}/categories",
- "host": [
- "{{baseUrl}}"
- ],
- "path": [
- "categories"
- ],
- "query": [
- {
- "key": "from",
- "value": "0",
- "description": "количество категорий, которые нужно пропустить для формирования текущего набора",
- "disabled": true
- },
- {
- "key": "size",
- "value": "10000",
- "description": "количество категорий в наборе",
- "disabled": true
- }
- ]
- }
- },
- "response": []
- }
- ]
- },
- {
- "name": "Required params in body",
- "item": [
- {
- "name": "Добавление категории с именем, состоящим из пробелов",
+ "name": "Добавление нового события с description.length == 20 && annotation.length == 20 && title.length == 3",
"event": [
{
"listen": "prerequest",
@@ -2114,16 +2319,22 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
+ " let event;\r",
" try {\r",
- " category = {name: ' '};\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.description = rnd.getWord(20);\r",
+ " event.annotation = rnd.getWord(20);\r",
+ " event.title = rnd.getWord(3);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -2150,8 +2361,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
- " pm.response.to.be.badRequest; \r",
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -2163,26 +2374,49 @@
],
"request": {
"method": "POST",
- "header": [],
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
- "raw": ""
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
},
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление категории с пустым полем name",
+ "name": "Добавление нового события с description.length == 7000 && annotation.length == 2000 && title.length == 120",
"event": [
{
"listen": "prerequest",
@@ -2192,16 +2426,22 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
+ " let event;\r",
" try {\r",
- " category = {name: ''};\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.description = rnd.getWord(7000);\r",
+ " event.annotation = rnd.getWord(2000);\r",
+ " event.title = rnd.getWord(120);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -2228,8 +2468,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
- " pm.response.to.be.badRequest; \r",
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -2241,26 +2481,49 @@
],
"request": {
"method": "POST",
- "header": [],
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
- "raw": ""
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
},
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление категории без поля name",
+ "name": "Добавление нового события с title.length < 3",
"event": [
{
"listen": "prerequest",
@@ -2270,16 +2533,20 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
+ " let event;\r",
" try {\r",
- " category = {};\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.title = rnd.getWord(2);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
"\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -2319,31 +2586,49 @@
],
"request": {
"method": "POST",
- "header": [],
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
- "raw": ""
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
},
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories"
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- }
- ]
- },
- {
- "name": "Misc tests",
- "item": [
+ },
{
- "name": "Изменение категории с неизменными данными",
+ "name": "Добавление нового события с title.length > 120",
"event": [
{
"listen": "prerequest",
@@ -2352,17 +2637,21 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- " let category, categoryObj\r",
+ "\r",
+ " let event;\r",
" try {\r",
- " category = rnd.getCategory();\r",
- " categoryObj = await api.addCategory(category);\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " event.title = rnd.getWord(121);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- " pm.collectionVariables.set(\"catid\", Number(categoryObj.id))\r",
+ "\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
+ " raw: JSON.stringify(event),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -2389,63 +2678,62 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.be.ok; \r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
- "\r",
- "const source = JSON.parse(pm.request.body.raw);\r",
- "const target = pm.response.json();\r",
- "\r",
- "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
- "pm.expect(target).to.have.property('id');\r",
- "pm.expect(target).to.have.property('name');\r",
- "});\r",
- "\r",
- "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(target.id).to.not.be.null;\r",
- " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
- "});"
+ ""
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "PATCH",
- "header": [],
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
- "raw": "{{request_body}}"
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
},
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories",
- ":catId"
+ "users",
+ ":userId",
+ "events"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
}
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
- }
- ]
- },
- {
- "name": "String length restrictions",
- "item": [
+ },
{
- "name": "Добавление новой категории с name.length > 50",
+ "name": "Изменение заголовка события с title.length < 3 (admin endpoint)",
"event": [
{
"listen": "prerequest",
@@ -2455,18 +2743,21 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
" try {\r",
- " category = {'name': rnd.getWord(51)};\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.title = rnd.getWord(2);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -2474,6 +2765,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -2503,12 +2795,8 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
@@ -2516,29 +2804,32 @@
],
"body": {
"mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
+ "raw": "{{request_body}}"
},
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories"
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
]
},
- "description": "Обратите внимание: имя категории должно быть уникальным"
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
},
{
- "name": "Добавление новой категории с name.length == 50",
+ "name": "Изменение заголовка события с title.length > 120 (admin endpoint)",
"event": [
{
"listen": "prerequest",
@@ -2548,18 +2839,21 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
" try {\r",
- " category = {'name': rnd.getWord(50)};\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.title = rnd.getWord(121);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -2567,6 +2861,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -2584,8 +2879,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -2596,12 +2891,8 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
@@ -2609,29 +2900,32 @@
],
"body": {
"mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
+ "raw": "{{request_body}}"
},
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories"
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
]
},
- "description": "Обратите внимание: имя категории должно быть уникальным"
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
},
{
- "name": "Изменение имени категории с name.length > 50",
+ "name": "Изменение описания события с description.length < 20 (admin endpoint)",
"event": [
{
"listen": "prerequest",
@@ -2640,20 +2934,22 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- " let category\r",
+ "\r",
" try {\r",
- " category = await api.addCategory(rnd.getCategory());\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.description = rnd.getWord(19);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify({\r",
- " name : rnd.getWord(51)\r",
- " }),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -2661,6 +2957,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -2691,33 +2988,40 @@
],
"request": {
"method": "PATCH",
- "header": [],
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
"raw": "{{request_body}}"
},
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories",
- ":catId"
+ "events",
+ ":eventId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
- }
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
},
{
- "name": "Изменение имени категории с name.length == 50",
+ "name": "Изменение описания события с description.length > 7000 (admin endpoint)",
"event": [
{
"listen": "prerequest",
@@ -2726,20 +3030,22 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- " let category\r",
+ "\r",
" try {\r",
- " category = await api.addCategory(rnd.getCategory());\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.description = rnd.getWord(7001);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify({\r",
- " name : rnd.getWord(50)\r",
- " }),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -2747,6 +3053,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -2764,8 +3071,8 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(200);\r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
@@ -2777,38 +3084,40 @@
],
"request": {
"method": "PATCH",
- "header": [],
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
"raw": "{{request_body}}"
},
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories",
- ":catId"
+ "events",
+ ":eventId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
- }
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
- }
- ]
- },
- {
- "name": "Default values check",
- "item": [
+ },
{
- "name": "Проверка на значения по-умолчанию from и size(category)",
+ "name": "Изменение аннотации события с annotation.length < 20 (admin endpoint)",
"event": [
{
"listen": "prerequest",
@@ -2819,14 +3128,17 @@
" const rnd = new RandomUtils();\r",
"\r",
" try {\r",
- " for (let i = 0; i < 11; i++){\r",
- " await api.addCategory(rnd.getCategory());\r",
- " }\r",
- " await pm.sendRequest({\r",
- " url : \"http://localhost:8080/categories?from=0\",\r",
- " method : \"GET\",\r",
- " header: { \"Content-Type\": \"application/json\" }\r",
- " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.annotation = rnd.getWord(19);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -2837,6 +3149,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -2854,21 +3167,106 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.be.ok; \r",
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение аннотации события с annotation.length > 2000 (admin endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
"\r",
- "const target = pm.response.json();\r",
- "const source = pm.collectionVariables.get('source');\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.annotation = rnd.getWord(2001);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
"\r",
- "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
- " pm.expect(target[0].id).to.be.equal(source[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
- "});\r",
+ "const interval = setInterval(() => {}, 1000);\r",
"\r",
- "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
- " pm.expect(target.length).to.be.equal(10);\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
"});\r",
""
],
@@ -2877,71 +3275,5598 @@
}
],
"request": {
- "method": "GET",
+ "method": "PATCH",
"header": [
{
"key": "Accept",
"value": "application/json"
}
],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
"url": {
- "raw": "{{baseUrl}}/categories",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "categories"
+ "admin",
+ "events",
+ ":eventId"
],
- "query": [
- {
- "key": "from",
- "value": "0",
- "description": "количество категорий, которые нужно пропустить для формирования текущего набора",
- "disabled": true
- },
+ "variable": [
{
- "key": "size",
- "value": "1000",
- "description": "количество категорий в наборе",
- "disabled": true
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
- }
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "name": "409 Conflict",
- "item": [
- {
- "name": "Попытка изменения имени категории на уже существующее",
- "event": [
- {
- "listen": "prerequest",
- "script": {
- "exec": [
- "const main = async () => {\r",
- " const api = new API(pm);\r",
- " const rnd = new RandomUtils();\r",
- " let category1, category2\r",
- " try {\r",
- " category1 = await api.addCategory(rnd.getCategory());\r",
- " category2 = await api.addCategory(rnd.getCategory());\r",
- " } catch(err) {\r",
- " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
- " }\r",
- " pm.collectionVariables.set(\"catid\", category2.id)\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify({\r",
- " name : category1.name\r",
- " }),\r",
+ },
+ {
+ "name": "Изменение события с description.length == 20 && annotation.length == 20 && title.length == 3 (admin endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.annotation = rnd.getWord(20);\r",
+ " event2.description = rnd.getWord(20);\r",
+ " event2.title = rnd.getWord(3);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(200);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение события с description.length == 7000 && annotation.length == 2000 && title.length == 120 (admin endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.annotation = rnd.getWord(2000);\r",
+ " event2.description = rnd.getWord(7000);\r",
+ " event2.title = rnd.getWord(120);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(200);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение заголовка события с title.length < 3 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " title: rnd.getWord(2)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение заголовка события с title.length > 120 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " title: rnd.getWord(121)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение описания события с description.length < 20 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " description: rnd.getWord(19)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение описания события с description.length > 7000 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " description: rnd.getWord(7001)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение аннотации события с annotation.length < 20 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " annotation: rnd.getWord(19)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение аннотации события с annotation.length > 2000 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " annotation: rnd.getWord(2001)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение события с description.length == 20 && annotation.length == 20 && title.length == 3 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " description: rnd.getWord(20),\r",
+ " annotation: rnd.getWord(20),\r",
+ " title: rnd.getWord(3)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(200);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение события с description.length == 7000 && annotation.length == 2000 && title.length == 120 (user endpoint)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " description: rnd.getWord(7000),\r",
+ " annotation: rnd.getWord(2000),\r",
+ " title: rnd.getWord(120)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(200);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Default values check",
+ "item": [
+ {
+ "name": "Добавление нового события без paid, participantLimit, requestModeration",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let usersArr = Array.from({length: 10}, () => rnd.getUser());\r",
+ " let categoriesArr = Array.from({length: 10}, () => rnd.getCategory());\r",
+ " let usersResponseArr = [], categoriesResponseArr = [], eventArr, eventResponseArr = [];\r",
+ " try {\r",
+ " for (const u of usersArr){\r",
+ " usersResponseArr.push(await api.addUser(u));\r",
+ " }\r",
+ " for (const c of categoriesArr){\r",
+ " categoriesResponseArr.push(await api.addCategory(c));\r",
+ " }\r",
+ " eventArr = Array.from(categoriesResponseArr, (x) => rnd.getEvent(x.id));\r",
+ " for (let i = 0; i < 10; i++){\r",
+ " delete eventArr[i].requestModeration;\r",
+ " delete eventArr[i].paid;\r",
+ " delete eventArr[i].participantLimit;\r",
+ " }\r",
+ " for (let i = 0; i < 10; i++){\r",
+ " eventResponseArr.push(await api.addEvent(usersResponseArr[i].id, eventArr[i]));\r",
+ " }\r",
+ " pm.collectionVariables.set('responseArr', eventResponseArr)\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(event),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201); \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = pm.collectionVariables.get('responseArr');\r",
+ "\r",
+ "\r",
+ "pm.test(\"У каждого созданного события paid должно принять значение по умолчанию(false)\", function () {\r",
+ " source.forEach(function(x){pm.expect(x.paid).to.be.equal(false)});\r",
+ "});\r",
+ "\r",
+ "pm.test(\"У каждого созданного события participantLimit должен принять значение по умолчанию(0)\", function () {\r",
+ " source.forEach(function(x){pm.expect(x.participantLimit).to.be.equal(0)});\r",
+ "});\r",
+ "\r",
+ "pm.test(\"У каждого созданного события requestModeration должно принять значение по умолчанию(true)\", function () {\r",
+ " source.forEach(function(x){pm.expect(x.requestModeration).to.be.equal(true)});\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
+ ]
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
+ },
+ "response": []
+ },
+ {
+ "name": "Проверка на значения по-умолчанию from и size(event)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user, category, eventArr;\r",
+ " try {\r",
+ " user = await api.addUser(rnd.getUser());\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
+ " eventArr = Array.from({length:11}, () => rnd.getEvent(category.id));\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " await api.addEvent(user.id, eventArr[i]);\r",
+ " }\r",
+ " await pm.sendRequest({\r",
+ " url : \"http://localhost:8080/admin/events?from=0\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('source');\r",
+ "\r",
+ "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
+ " pm.expect(target[0].id).to.be.equal(source[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
+ " pm.expect(target.length).to.be.equal(10);\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/events",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events"
+ ],
+ "query": [
+ {
+ "key": "users",
+ "value": "0",
+ "description": "список id пользователей, чьи события нужно найти",
+ "disabled": true
+ },
+ {
+ "key": "states",
+ "value": "PUBLISHED",
+ "description": "список состояний в которых находятся искомые события",
+ "disabled": true
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список id категорий в которых будет вестись поиск",
+ "disabled": true
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе",
+ "disabled": true
+ }
+ ]
+ },
+ "description": "Эндпоинт возвращает полную информацию обо всех событиях подходящих под переданные условия"
+ },
+ "response": []
+ },
+ {
+ "name": "Получение событий, добавленных текущим пользователем. Проверка на значения по-умолчанию size и from",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let eventArr, user, category, eventResponseArr = [];\r",
+ " try {\r",
+ " user = await api.addUser(rnd.getUser());\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
+ " eventArr = Array.from({length:11}, () => rnd.getEvent(category.id));\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " eventResponseArr.push(await api.addEvent(user.id, eventArr[i]));\r",
+ " }\r",
+ " pm.collectionVariables.set('responseArr', eventResponseArr)\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " await pm.sendRequest({\r",
+ " url : \"http://localhost:8080/users/\" + user.id + \"/events?from=0\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('responseArr');\r",
+ "newSourceArr = Array.from(source, (x) => x.id);\r",
+ "const responseWithFrom = pm.collectionVariables.get('source');\r",
+ "\r",
+ "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
+ " pm.expect(target.length).to.equal(10);\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
+ " pm.expect(target[0].id).to.be.equal(responseWithFrom[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Все найденные события должны быть в списке добавленных\", function () {\r",
+ " source.forEach(function(x){pm.expect(newSourceArr).to.include(x.id)});\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events"
+ ],
+ "query": [
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество элементов в наборе",
+ "disabled": true
+ }
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Получение событий с возможностью фильтрации. Проверка на значение по-умолчанию size",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user, category, eventArr, eventResponseArr = [], publishEventResponseArr = [];\r",
+ " try {\r",
+ " user = await api.addUser(rnd.getUser());\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
+ " eventArr = Array.from({length:11}, () => rnd.getEvent(category.id));\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " eventResponseArr.push(await api.addEvent(user.id, eventArr[i]));\r",
+ " }\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " publishEventResponseArr.push(await api.publishEvent(eventResponseArr[i].id));\r",
+ " }\r",
+ " pm.collectionVariables.set('responseArr', eventResponseArr);\r",
+ " pm.collectionVariables.set('catid', category.id);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('responseArr');\r",
+ "newSourceArr = Array.from(source, (x) => x.id);\r",
+ "\r",
+ "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
+ " pm.expect(target.length).to.equal(10);\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Все найденные события должны быть в списке добавленных\", function () {\r",
+ " source.forEach(function(x){pm.expect(newSourceArr).to.include(x.id)});\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/events?categories={{catid}}",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "events"
+ ],
+ "query": [
+ {
+ "key": "text",
+ "value": "0",
+ "description": "текст для поиска в содержимом аннотации и подробном описании события",
+ "disabled": true
+ },
+ {
+ "key": "categories",
+ "value": "{{catid}}",
+ "description": "список идентификаторов категорий в которых будет вестись поиск"
+ },
+ {
+ "key": "paid",
+ "value": "true",
+ "description": "поиск только платных/бесплатных событий",
+ "disabled": true
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "onlyAvailable",
+ "value": "false",
+ "description": "только события у которых не исчерпан лимит запросов на участие",
+ "disabled": true
+ },
+ {
+ "key": "sort",
+ "value": "EVENT_DATE",
+ "description": "Вариант сортировки: по дате события или по количеству просмотров",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе",
+ "disabled": true
+ }
+ ]
+ },
+ "description": "Обратите внимание: \n- это публичный эндпоинт, соответственно в выдаче должны быть только опубликованные события\n- текстовый поиск (по аннотации и подробному описанию) должен быть без учета регистра букв\n- если в запросе не указан диапазон дат [rangeStart-rangeEnd], то нужно выгружать события, которые произойдут позже текущей даты и времени\n- информация о каждом событии должна включать в себя количество просмотров и количество уже одобренных заявок на участие\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
+ },
+ "response": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Users",
+ "item": [
+ {
+ "name": "Required query params",
+ "item": []
+ },
+ {
+ "name": "Unrequired query params",
+ "item": [
+ {
+ "name": "Поиск пользователей без нескольких Query params",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let compilation;\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/users?ids={{uid}}",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ],
+ "query": [
+ {
+ "key": "ids",
+ "value": "{{uid}}",
+ "description": "id пользователей"
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "10",
+ "description": "количество элементов в наборе",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Поиск пользователей без параметра ids",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let compilation;\r",
+ " try {\r",
+ " let user1 = rnd.getUser();\r",
+ " user1 = await api.addUser(user1);\r",
+ "\r",
+ " let user2 = rnd.getUser()\r",
+ " user2 = await api.addUser(user2);\r",
+ " //pm.collectionVariables.set('fromId', user1.id);\r",
+ " pm.collectionVariables.set('source1', user1);\r",
+ " pm.collectionVariables.set('source2', user2);\r",
+ "\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source1 = pm.collectionVariables.get('source1');\r",
+ "const source2 = pm.collectionVariables.get('source2');\r",
+ "\r",
+ "pm.test(\"Пользователи должны содержать поля: id, name, email\", function () {\r",
+ " pm.expect(target[target.length-2]).to.have.property('id');\r",
+ " pm.expect(target[target.length-2]).to.have.property('name');\r",
+ " pm.expect(target[target.length-2]).to.have.property('email');\r",
+ " pm.expect(target[target.length-1]).to.have.property('id');\r",
+ " pm.expect(target[target.length-1]).to.have.property('name');\r",
+ " pm.expect(target[target.length-1]).to.have.property('email');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные последних двух пользователей должны совпадать с данными добавленных пользователей\", function () {\r",
+ " pm.expect(target[target.length-2].id).to.equal(source1.id);\r",
+ " pm.expect(target[target.length-2].name).to.equal(source1.name);\r",
+ " pm.expect(target[target.length-2].email).to.equal(source1.email);\r",
+ " pm.expect(target[target.length-1].id).to.equal(source2.id);\r",
+ " pm.expect(target[target.length-1].name).to.equal(source2.name);\r",
+ " pm.expect(target[target.length-1].email).to.equal(source2.email);\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/users?from={{fromId}}&size=100000",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ],
+ "query": [
+ {
+ "key": "ids",
+ "value": "{{uid}}",
+ "description": "id пользователей",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "{{fromId}}",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "100000",
+ "description": "количество элементов в наборе"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Поиск событий без нескольких Query params",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.request.removeQueryParams(['users', 'categories']);\r",
+ " pm.request.addQueryParams([`users=` + user.id, 'categories=' + category.id]);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/events",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events"
+ ],
+ "query": [
+ {
+ "key": "users",
+ "value": "0",
+ "description": "список id пользователей, чьи события нужно найти",
+ "disabled": true
+ },
+ {
+ "key": "states",
+ "value": "PUBLISHED",
+ "description": "список состояний в которых находятся искомые события",
+ "disabled": true
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список id категорий в которых будет вестись поиск",
+ "disabled": true
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе",
+ "disabled": true
+ }
+ ]
+ },
+ "description": "Эндпоинт возвращает полную информацию обо всех событиях подходящих под переданные условия"
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Required params in body",
+ "item": [
+ {
+ "name": "Добавление пользователя с электронной почтой, состоящей только из пробелов",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = \" \";\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с пустой электронной почтой",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = \"\";\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя без поля email",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " delete user.email;\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с пустым именем",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = \"\";\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с именем, состоящим только из пробелов",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = \" \";\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя без поля name",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " delete user.name;\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.have.status(400);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Misc tests",
+ "item": []
+ },
+ {
+ "name": "String length restrictions",
+ "item": [
+ {
+ "name": "Добавление пользователя с name.length < 2",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = rnd.getWord(1);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с name.length == 2",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = rnd.getWord(2);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с name.length > 250",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = rnd.getWord(251);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с name.length == 250",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = rnd.getWord(250);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.length < 6",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@a.r';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.length == 6",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@a.ru';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.localpart.length > 64",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(65) + '@a.ru';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.localpart.length == 64",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(59) + '@a.ru';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с domain.part.length > 63",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@' + rnd.getWord(64) + '.ru';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с domain.part.length == 63",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@' + rnd.getWord(60) + '.ru';\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.length > 254",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(61);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с email.length == 254",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.email = rnd.getWord(1) + '@' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(63) + '.' + rnd.getWord(60);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Default values check",
+ "item": [
+ {
+ "name": "Проверка на значения по-умолчанию from и size(user)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " await api.addUser(rnd.getUser());\r",
+ " }\r",
+ " await pm.sendRequest({\r",
+ " url : \"http://localhost:8080/admin/users?from=0\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('source');\r",
+ "\r",
+ "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
+ " pm.expect(target[0].id).to.be.equal(source[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
+ " pm.expect(target.length).to.be.equal(10);\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ],
+ "query": [
+ {
+ "key": "ids",
+ "value": "{{uid}}",
+ "description": "id пользователей",
+ "disabled": true
+ },
+ {
+ "key": "ids",
+ "value": "-10833646",
+ "description": "id пользователей",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "10",
+ "description": "количество элементов в наборе",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Category",
+ "item": [
+ {
+ "name": "Required query params",
+ "item": []
+ },
+ {
+ "name": "Unrequired params in body",
+ "item": [
+ {
+ "name": "Получение категорий без нескольких Query params",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "categories"
+ ],
+ "query": [
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество категорий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "10000",
+ "description": "количество категорий в наборе",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Required params in body",
+ "item": [
+ {
+ "name": "Добавление категории с именем, состоящим из пробелов",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = {name: ' '};\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление категории с пустым полем name",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = {name: ''};\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление категории без поля name",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = {};\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": ""
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Misc tests",
+ "item": [
+ {
+ "name": "Изменение категории с неизменными данными",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ " let category, categoryObj\r",
+ " try {\r",
+ " category = rnd.getCategory();\r",
+ " categoryObj = await api.addCategory(category);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ " pm.collectionVariables.set(\"catid\", Number(categoryObj.id))\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = JSON.parse(pm.request.body.raw);\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('name');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "String length restrictions",
+ "item": [
+ {
+ "name": "Добавление новой категории с name.length > 50",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = {'name': rnd.getWord(51)};\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ },
+ "description": "Обратите внимание: имя категории должно быть уникальным"
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление новой категории с name.length == 50",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = {'name': rnd.getWord(50)};\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ },
+ "description": "Обратите внимание: имя категории должно быть уникальным"
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение имени категории с name.length > 50",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ " let category\r",
+ " try {\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " name : rnd.getWord(51)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400 и данные в формате json\", function () {\r",
+ " pm.response.to.be.badRequest; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение имени категории с name.length == 50",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ " let category\r",
+ " try {\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " name : rnd.getWord(50)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(200);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Default values check",
+ "item": [
+ {
+ "name": "Проверка на значения по-умолчанию from и size(category)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " for (let i = 0; i < 11; i++){\r",
+ " await api.addCategory(rnd.getCategory());\r",
+ " }\r",
+ " await pm.sendRequest({\r",
+ " url : \"http://localhost:8080/categories?from=0\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {pm.collectionVariables.set('source', response.json())});\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('source');\r",
+ "\r",
+ "pm.test(\"Значение from по-умолчанию должно быть равным 0\", function () {\r",
+ " pm.expect(target[0].id).to.be.equal(source[0].id, 'Запросы с from=0 и без него должны начинаться с одного и того же события');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Значение size по-умолчанию должно быть равным 10\", function () {\r",
+ " pm.expect(target.length).to.be.equal(10);\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "categories"
+ ],
+ "query": [
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество категорий, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество категорий в наборе",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "409 Conflict",
+ "item": [
+ {
+ "name": "Попытка изменения имени категории на уже существующее",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ " let category1, category2\r",
+ " try {\r",
+ " category1 = await api.addCategory(rnd.getCategory());\r",
+ " category2 = await api.addCategory(rnd.getCategory());\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ " pm.collectionVariables.set(\"catid\", category2.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " name : category1.name\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ },
+ "description": "Обратите внимание: имя категории должно быть уникальным"
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление новой категории с занятым именем",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = rnd.getCategory();\r",
+ " await api.addCategory(category);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ },
+ "description": "Обратите внимание: имя категории должно быть уникальным"
+ },
+ "response": []
+ },
+ {
+ "name": "Добавление пользователя с занятым именем почты",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let user;\r",
+ " try {\r",
+ " user = rnd.getUser();\r",
+ " user.name = rnd.getWord(10);\r",
+ " await api.addUser(user);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(user),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/users",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "users"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Удаление категории с привязанными событиями",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set('catid', category.id);\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "DELETE",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ },
+ "description": "Обратите внимание: с категорий не должно быть связано ни одного события."
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение имени категории на уже занятое",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ " let category1, category2\r",
+ " try {\r",
+ " category1 = await api.addCategory(rnd.getCategory());\r",
+ " category2 = await api.addCategory(rnd.getCategory());\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ " pm.collectionVariables.set(\"catid\", Number(category1.id))\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " name : category2.name\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Публикация уже опубликованного события",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " stateAction : \"PUBLISH_EVENT\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Публикация отмененного события",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.rejectEvent(event.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " stateAction : \"PUBLISH_EVENT\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Отмена опубликованного события",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " stateAction : \"REJECT_EVENT\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " // выполняем наш скрипт\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
+ }
+ ]
+ },
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
+ },
+ "response": []
+ },
+ {
+ "name": "Изменение опубликованного события от имени пользователя",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.collectionVariables.set(\"response\", event);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " eventDate : rnd.getFutureDateTime(6)\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(409);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
+ ],
+ "variable": [
+ {
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
+ }
+ ]
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Category",
+ "item": [
+ {
+ "name": "Добавление новой категории",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let category;\r",
+ " try {\r",
+ " category = rnd.getCategory();\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(category),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -2968,37 +8893,330 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(409);\r",
- " pm.response.to.be.withBody;\r",
- " pm.response.to.be.json;\r",
- "});"
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = JSON.parse(pm.request.body.raw);\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('name');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories"
+ ]
+ },
+ "description": "Обратите внимание: имя категории должно быть уникальным"
+ },
+ "response": []
+ },
+ {
+ "name": "Получение категорий",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " pm.collectionVariables.set(\"response\", category)\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const target = pm.response.json();\r",
+ "let founded;\r",
+ "target.forEach(function(element){if (element.id == source.id) founded = element});\r",
+ "\r",
+ "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.expect(target[0]).to.have.property('id');\r",
+ "pm.expect(target[0]).to.have.property('name');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(source.id).equal(founded.id, 'Идентификатор категории должен соответствовать идентификатору категории добавленной ранее');\r",
+ " pm.expect(source.name).equal(founded.name, 'Название категории должно соответствовать названию категории добавленной ранее');\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/categories?from=0&size=1000",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "categories"
+ ],
+ "query": [
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество категорий, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество категорий в наборе"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Получение информации о категории по её идентификатору",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " pm.collectionVariables.set(\"response\", category)\r",
+ " pm.collectionVariables.set(\"catid\", category.id)\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('name');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(source.id).equal(target.id, 'Идентификатор категории должен соответствовать идентификатору в запросе');\r",
+ " pm.expect(source.name).equal(target.name, 'Название категории должно соответствовать названию категории с указанным идентификатором');\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}",
+ "description": "(Required) id категории"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Удаление категории",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try {\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const findedCategory = await api.findCategory(category.id);\r",
+ " pm.collectionVariables.set(\"catid\", category.id)\r",
+ " pm.collectionVariables.set(\"response\", findedCategory)\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r",
+ " pm.response.to.have.status(204);\r",
+ "});\r",
+ "\r",
+ "source = pm.collectionVariables.get('response');\r",
+ "catId = pm.collectionVariables.get('catid');\r",
+ "\r",
+ "pm.test(\"Категория должна быть найдена до удаления\", function () {\r",
+ " pm.expect(source.id).equal(catId, 'Идентификтор категории должен совпадать с удаляемым');\r",
+ "});\r",
+ "\r",
+ "pm.sendRequest({\r",
+ " url: pm.collectionVariables.get(\"baseUrl\") + \"/categories/\" + catId,\r",
+ " method: 'GET',\r",
+ " }, (error, response) => {\r",
+ " pm.test(\"Категория не должна быть найдена после удаления\", function () {\r",
+ " pm.expect(response.code).to.eql(404);\r",
+ " });\r",
+ " });"
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "PATCH",
+ "method": "DELETE",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
"raw": "{{baseUrl}}/admin/categories/:catId",
"host": [
@@ -3016,12 +9234,12 @@
}
]
},
- "description": "Обратите внимание: имя категории должно быть уникальным"
+ "description": "Обратите внимание: с категорий не должно быть связано ни одного события."
},
"response": []
},
{
- "name": "Добавление новой категории с занятым именем",
+ "name": "Изменение категории",
"event": [
{
"listen": "prerequest",
@@ -3030,18 +9248,18 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- "\r",
- " let category;\r",
+ " let category\r",
" try {\r",
- " category = rnd.getCategory();\r",
- " await api.addCategory(category);\r",
+ " category = await api.addCategory(rnd.getCategory());\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
+ " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
" pm.request.body.update({\r",
" mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
+ " raw: JSON.stringify({\r",
+ " name : rnd.getCategory().name\r",
+ " }),\r",
" options: { raw: { language: 'json' } }\r",
" });\r",
"};\r",
@@ -3068,10 +9286,23 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(409);\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = JSON.parse(pm.request.body.raw);\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('name');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
"});"
],
"type": "text/javascript"
@@ -3079,42 +9310,153 @@
}
],
"request": {
- "method": "POST",
+ "method": "PATCH",
+ "header": [],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
+ "url": {
+ "raw": "{{baseUrl}}/admin/categories/:catId",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "admin",
+ "categories",
+ ":catId"
+ ],
+ "variable": [
+ {
+ "key": "catId",
+ "value": "{{catid}}"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ },
+ {
+ "name": "Users",
+ "item": [
+ {
+ "name": "Поиск пользователей",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " let compilation;\r",
+ " try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Пользователи должны содержать поля: id, name, email\", function () {\r",
+ " pm.expect(target[0]).to.have.property('id');\r",
+ " pm.expect(target[0]).to.have.property('name');\r",
+ " pm.expect(target[0]).to.have.property('email');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Должен быть найден только один пользователь по заданному фильтру\", function () {\r",
+ " pm.expect(target.length).to.eql(1);\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target[0].id).equal(pm.collectionVariables.get(\"uid\"));\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/admin/users?ids={{uid}}",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories"
+ "users"
+ ],
+ "query": [
+ {
+ "key": "ids",
+ "value": "{{uid}}",
+ "description": "id пользователей"
+ },
+ {
+ "key": "ids",
+ "value": "-10833646",
+ "description": "id пользователей",
+ "disabled": true
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
+ "disabled": true
+ },
+ {
+ "key": "size",
+ "value": "10",
+ "description": "количество элементов в наборе",
+ "disabled": true
+ }
]
- },
- "description": "Обратите внимание: имя категории должно быть уникальным"
+ }
},
"response": []
},
{
- "name": "Добавление пользователя с занятым именем почты",
+ "name": "Добавление нового пользователя",
"event": [
{
"listen": "prerequest",
@@ -3127,8 +9469,6 @@
" let user;\r",
" try {\r",
" user = rnd.getUser();\r",
- " user.name = rnd.getWord(10);\r",
- " await api.addUser(user);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -3162,10 +9502,25 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(409);\r",
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const source = JSON.parse(pm.request.body.raw);\r",
+ "const target = pm.response.json();\r",
+ "\r",
+ "pm.test(\"Пользователь должен содержать поля: id, name, email\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('name');\r",
+ "pm.expect(target).to.have.property('email');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ " pm.expect(source.name).equal(target.name, 'Имя пользователя должно соответствовать отправленному в запросе');\r",
+ " pm.expect(source.email).equal(target.email, 'Почта пользователя должна соответствовать отправленной в запросе');\r",
"});"
],
"type": "text/javascript"
@@ -3207,8 +9562,38 @@
"response": []
},
{
- "name": "Изменение имени категории на уже занятое",
+ "name": "Удаление пользователя",
"event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r",
+ " pm.response.to.have.status(204);\r",
+ "});\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const userId = pm.collectionVariables.get('uid');\r",
+ "\r",
+ "pm.test(\"Пользователь должен быть найден до выполнения запроса\", function(){\r",
+ " pm.expect(source.length).to.eql(1);\r",
+ " pm.expect(source[0].id).to.eql(userId);\r",
+ "});\r",
+ "let body\r",
+ "const req = {\r",
+ " url: \"http://localhost:8080/admin/users?ids=\" + pm.collectionVariables.get(\"uid\"),\r",
+ " method: \"GET\",\r",
+ " body: body == null ? \"\" : JSON.stringify(body),\r",
+ " header: { \"Content-Type\": \"application/json\" },\r",
+ " };\r",
+ "pm.sendRequest(req, (error, response) => {\r",
+ " pm.test(\"Пользователь должен быть удалён после выполнения запроса\", function(){\r",
+ " pm.expect(response.json().length).to.eql(0);\r",
+ " });\r",
+ "})"
+ ],
+ "type": "text/javascript"
+ }
+ },
{
"listen": "prerequest",
"script": {
@@ -3216,21 +9601,16 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- " let category1, category2\r",
+ "\r",
+ " let compilation;\r",
" try {\r",
- " category1 = await api.addCategory(rnd.getCategory());\r",
- " category2 = await api.addCategory(rnd.getCategory());\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const foundedUser = await api.findUser(user.id);\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"response\", foundedUser)\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- " pm.collectionVariables.set(\"catid\", Number(category1.id))\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify({\r",
- " name : category2.name\r",
- " }),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -3250,42 +9630,31 @@
],
"type": "text/javascript"
}
- },
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(409);\r",
- " pm.response.to.be.withBody;\r",
- " pm.response.to.be.json;\r",
- "});"
- ],
- "type": "text/javascript"
- }
}
],
"request": {
- "method": "PATCH",
- "header": [],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}"
- },
+ "method": "DELETE",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/admin/users/:userId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories",
- ":catId"
+ "users",
+ ":userId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id пользователя"
}
]
}
@@ -3295,10 +9664,10 @@
]
},
{
- "name": "Users",
+ "name": "Event",
"item": [
{
- "name": "Поиск пользователей",
+ "name": "Добавление нового события",
"event": [
{
"listen": "prerequest",
@@ -3308,13 +9677,21 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let compilation;\r",
+ " let event;\r",
" try {\r",
" const user = await api.addUser(rnd.getUser());\r",
" pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " event = rnd.getEvent(category.id);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(event),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -3339,26 +9716,42 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
- " pm.response.to.be.ok; \r",
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201); \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
+ "const source = JSON.parse(pm.request.body.raw);\r",
"const target = pm.response.json();\r",
"\r",
- "pm.test(\"Пользователи должны содержать поля: id, name, email\", function () {\r",
- " pm.expect(target[0]).to.have.property('id');\r",
- " pm.expect(target[0]).to.have.property('name');\r",
- " pm.expect(target[0]).to.have.property('email');\r",
- "});\r",
- "\r",
- "pm.test(\"Должен быть найден только один пользователь по заданному фильтру\", function () {\r",
- " pm.expect(target.length).to.eql(1);\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, description, participantLimit, state, createdOn, location, requestModeration\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(target[0].id).equal(pm.collectionVariables.get(\"uid\"));\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ " pm.expect(target.title).equal(source.title, 'Название события должно соответствовать названию события в запросе');\r",
+ " pm.expect(target.annotation).equal(source.annotation, 'Аннотация события должна соответствовать аннотации события в запросе');\r",
+ " pm.expect(target.paid.toString()).equal(source.paid.toString(), 'Стоимость события должна соответствовать стоимости события в запросе');\r",
+ " pm.expect(target.eventDate).equal(source.eventDate, 'Дата проведения события должна соответствовать дате проведения события в запросе');\r",
+ " pm.expect(target.description).equal(source.description, 'Описание события должно соответствовать описание события в запросе');\r",
+ " pm.expect(target.participantLimit.toString()).equal(source.participantLimit.toString(), 'Лимит участников события должно соответствовать лимиту участников события в запросе');\r",
+ " pm.expect(target.location.lat.toString()).equal(source.location.lat.toString(), 'Широта локации проведения события должна соответствовать широте локации проведения события в запросе');\r",
+ " pm.expect(target.location.lon.toString()).equal(source.location.lon.toString(), 'Долгота локации проведения события должна соответствовать долготе локации проведения события в запросе');\r",
+ " pm.expect(target.requestModeration.toString()).equal(source.requestModeration.toString(), 'Необходимость модерации события должна соответствовать необходимости модерации события в запросе');\r",
"});"
],
"type": "text/javascript"
@@ -3366,53 +9759,50 @@
}
],
"request": {
- "method": "GET",
+ "method": "POST",
"header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
{
"key": "Accept",
"value": "application/json"
}
],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
"url": {
- "raw": "{{baseUrl}}/admin/users?ids={{uid}}",
+ "raw": "{{baseUrl}}/users/:userId/events",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "users"
+ "users",
+ ":userId",
+ "events"
],
- "query": [
+ "variable": [
{
- "key": "ids",
+ "key": "userId",
"value": "{{uid}}",
- "description": "id пользователей"
- },
- {
- "key": "ids",
- "value": "-10833646",
- "description": "id пользователей",
- "disabled": true
- },
- {
- "key": "from",
- "value": "0",
- "description": "количество элементов, которые нужно пропустить для формирования текущего набора",
- "disabled": true
- },
- {
- "key": "size",
- "value": "10",
- "description": "количество элементов в наборе",
- "disabled": true
+ "description": "(Required) id текущего пользователя"
}
]
- }
+ },
+ "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента"
},
"response": []
},
{
- "name": "Добавление нового пользователя",
+ "name": "Поиск событий",
"event": [
{
"listen": "prerequest",
@@ -3422,18 +9812,17 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let user;\r",
" try {\r",
- " user = rnd.getUser();\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.request.removeQueryParams(['users', 'categories']);\r",
+ " pm.request.addQueryParams([`users=` + user.id, 'categories=' + category.id]);\r",
+ " pm.collectionVariables.set('response', event);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(user),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -3441,6 +9830,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -3458,25 +9848,42 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const source = JSON.parse(pm.request.body.raw);\r",
- "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const target = pm.response.json()[0];\r",
"\r",
- "pm.test(\"Пользователь должен содержать поля: id, name, email\", function () {\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r",
"pm.expect(target).to.have.property('id');\r",
- "pm.expect(target).to.have.property('name');\r",
- "pm.expect(target).to.have.property('email');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('views');\r",
+ "pm.expect(target).to.have.property('confirmedRequests');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('publishedOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(target.id).to.not.be.null;\r",
- " pm.expect(source.name).equal(target.name, 'Имя пользователя должно соответствовать отправленному в запросе');\r",
- " pm.expect(source.email).equal(target.email, 'Почта пользователя должна соответствовать отправленной в запросе');\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация события должна соответствовать искомому событию');\r",
+ " pm.expect(source.category.id).equal(target.category.id, 'Идентификатор категории должен соответствовать искомой категории');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость посещения события должна соответствовать искомому событию');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения события должна соответствовать дате искомого события');\r",
+ " pm.expect(source.description).equal(target.description, 'Описание события должно соответствовать искомому событию');\r",
+ " pm.expect(source.title).equal(target.title, 'Название события должно соответствовать искомому событию');\r",
+ " pm.expect(source.participantLimit.toString()).equal(target.participantLimit.toString(), 'Число участников события должно соответствовать искомому событию');\r",
"});"
],
"type": "text/javascript"
@@ -3484,72 +9891,67 @@
}
],
"request": {
- "method": "POST",
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/users",
+ "raw": "{{baseUrl}}/admin/events?users=0&states=PUBLISHED&categories=0&rangeStart=2022-01-06%2013%3A30%3A38&rangeEnd=2097-09-06%2013%3A30%3A38&from=0&size=1000",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "users"
+ "events"
+ ],
+ "query": [
+ {
+ "key": "users",
+ "value": "0",
+ "description": "список id пользователей, чьи события нужно найти"
+ },
+ {
+ "key": "states",
+ "value": "PUBLISHED",
+ "description": "список состояний в которых находятся искомые события"
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список id категорий в которых будет вестись поиск"
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие"
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие"
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе"
+ }
]
- }
+ },
+ "description": "Эндпоинт возвращает полную информацию обо всех событиях подходящих под переданные условия"
},
"response": []
},
{
- "name": "Удаление пользователя",
+ "name": "Получение событий, добавленных текущим пользователем",
"event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r",
- " pm.response.to.have.status(204);\r",
- "});\r",
- "const source = pm.collectionVariables.get('response');\r",
- "const userId = pm.collectionVariables.get('uid');\r",
- "\r",
- "pm.test(\"Пользователь должен быть найден до выполнения запроса\", function(){\r",
- " pm.expect(source.length).to.eql(1);\r",
- " pm.expect(source[0].id).to.eql(userId);\r",
- "});\r",
- "let body\r",
- "const req = {\r",
- " url: \"http://localhost:8080/admin/users?ids=\" + pm.collectionVariables.get(\"uid\"),\r",
- " method: \"GET\",\r",
- " body: body == null ? \"\" : JSON.stringify(body),\r",
- " header: { \"Content-Type\": \"application/json\" },\r",
- " };\r",
- "pm.sendRequest(req, (error, response) => {\r",
- " pm.test(\"Пользователь должен быть удалён после выполнения запроса\", function(){\r",
- " pm.expect(response.json().length).to.eql(0);\r",
- " });\r",
- "})"
- ],
- "type": "text/javascript"
- }
- },
{
"listen": "prerequest",
"script": {
@@ -3558,12 +9960,11 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let compilation;\r",
" try {\r",
- " const user = await api.addUser(rnd.getUser());\r",
- " const foundedUser = await api.findUser(user.id);\r",
- " pm.collectionVariables.set(\"uid\", user.id);\r",
- " pm.collectionVariables.set(\"response\", foundedUser)\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -3586,10 +9987,33 @@
],
"type": "text/javascript"
}
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
+ "});\r",
+ "\r",
+ "const target = pm.response.json()[0];\r",
+ "\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate\", function () {\r",
+ " pm.expect(target).to.contain.keys('id', 'title', 'annotation', 'category', 'paid', 'eventDate');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(target.id).to.not.be.null;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
}
],
"request": {
- "method": "DELETE",
+ "method": "GET",
"header": [
{
"key": "Accept",
@@ -3597,33 +10021,40 @@
}
],
"url": {
- "raw": "{{baseUrl}}/admin/users/:userId",
+ "raw": "{{baseUrl}}/users/:userId/events?from=0&size=1000",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
"users",
- ":userId"
+ ":userId",
+ "events"
+ ],
+ "query": [
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество элементов, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество элементов в наборе"
+ }
],
"variable": [
{
"key": "userId",
"value": "{{uid}}",
- "description": "(Required) id пользователя"
+ "description": "(Required) id текущего пользователя"
}
]
}
},
"response": []
- }
- ]
- },
- {
- "name": "Category",
- "item": [
+ },
{
- "name": "Добавление новой категории",
+ "name": "Получение событий с возможностью фильтрации",
"event": [
{
"listen": "prerequest",
@@ -3633,18 +10064,17 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " let category;\r",
" try {\r",
- " category = rnd.getCategory();\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.request.removeQueryParams(['text', 'categories', 'paid']);\r",
+ " pm.request.addQueryParams([`text=` + event.annotation, 'categories=' + category.id, 'paid=' + event.paid]);\r",
+ " pm.collectionVariables.set('response', event);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- "\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify(category),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -3652,6 +10082,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -3669,23 +10100,33 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
- " pm.response.to.have.status(201);\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const source = JSON.parse(pm.request.body.raw);\r",
- "const target = pm.response.json();\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const target = pm.response.json()[0];\r",
"\r",
- "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests\", function () {\r",
"pm.expect(target).to.have.property('id');\r",
- "pm.expect(target).to.have.property('name');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('views');\r",
+ "pm.expect(target).to.have.property('confirmedRequests');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(target.id).to.not.be.null;\r",
- " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация события должна соответствовать аннотации события с указанным идентификатором');\r",
+ " pm.expect(source.category.id).equal(target.category.id, 'Категория события должна соответствовать категории события с указанным идентификатором');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость события должна соответствовать стоимости события с указанным идентификатором');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения события должна соответствовать дате проведения события с указанным идентификатором');\r",
+ " pm.expect(source.title).equal(target.title, 'Название события должно соответствовать названию события с указанным идентификатором');\r",
"});"
],
"type": "text/javascript"
@@ -3693,42 +10134,75 @@
}
],
"request": {
- "method": "POST",
+ "method": "GET",
"header": [
- {
- "key": "Content-Type",
- "value": "application/json"
- },
{
"key": "Accept",
"value": "application/json"
}
],
- "body": {
- "mode": "raw",
- "raw": "{{request_body}}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
"url": {
- "raw": "{{baseUrl}}/admin/categories",
+ "raw": "{{baseUrl}}/events?text=0&categories=0&paid=true&rangeStart=2022-01-06%2013%3A30%3A38&rangeEnd=2097-09-06%2013%3A30%3A38&onlyAvailable=false&sort=EVENT_DATE&from=0&size=1000",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories"
+ "events"
+ ],
+ "query": [
+ {
+ "key": "text",
+ "value": "0",
+ "description": "текст для поиска в содержимом аннотации и подробном описании события"
+ },
+ {
+ "key": "categories",
+ "value": "0",
+ "description": "список идентификаторов категорий в которых будет вестись поиск"
+ },
+ {
+ "key": "paid",
+ "value": "true",
+ "description": "поиск только платных/бесплатных событий"
+ },
+ {
+ "key": "rangeStart",
+ "value": "2022-01-06%2013%3A30%3A38",
+ "description": "дата и время не раньше которых должно произойти событие"
+ },
+ {
+ "key": "rangeEnd",
+ "value": "2097-09-06%2013%3A30%3A38",
+ "description": "дата и время не позже которых должно произойти событие"
+ },
+ {
+ "key": "onlyAvailable",
+ "value": "false",
+ "description": "только события у которых не исчерпан лимит запросов на участие"
+ },
+ {
+ "key": "sort",
+ "value": "EVENT_DATE",
+ "description": "Вариант сортировки: по дате события или по количеству просмотров"
+ },
+ {
+ "key": "from",
+ "value": "0",
+ "description": "количество событий, которые нужно пропустить для формирования текущего набора"
+ },
+ {
+ "key": "size",
+ "value": "1000",
+ "description": "количество событий в наборе"
+ }
]
},
- "description": "Обратите внимание: имя категории должно быть уникальным"
+ "description": "Обратите внимание: \n- это публичный эндпоинт, соответственно в выдаче должны быть только опубликованные события\n- текстовый поиск (по аннотации и подробному описанию) должен быть без учета регистра букв\n- если в запросе не указан диапазон дат [rangeStart-rangeEnd], то нужно выгружать события, которые произойдут позже текущей даты и времени\n- информация о каждом событии должна включать в себя количество просмотров и количество уже одобренных заявок на участие\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
},
{
- "name": "Получение категорий",
+ "name": "Получение подробной информации об опубликованном событии по его идентификатору",
"event": [
{
"listen": "prerequest",
@@ -3739,8 +10213,12 @@
" const rnd = new RandomUtils();\r",
"\r",
" try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
" const category = await api.addCategory(rnd.getCategory());\r",
- " pm.collectionVariables.set(\"response\", category)\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.collectionVariables.set('response', event);\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -3751,6 +10229,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -3776,17 +10255,34 @@
"\r",
"const source = pm.collectionVariables.get('response');\r",
"const target = pm.response.json();\r",
- "let founded;\r",
- "target.forEach(function(element){if (element.id == source.id) founded = element});\r",
"\r",
- "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
- "pm.expect(target[0]).to.have.property('id');\r",
- "pm.expect(target[0]).to.have.property('name');\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('views');\r",
+ "pm.expect(target).to.have.property('confirmedRequests');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('publishedOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(source.id).equal(founded.id, 'Идентификатор категории должен соответствовать идентификатору категории добавленной ранее');\r",
- " pm.expect(source.name).equal(founded.name, 'Название категории должно соответствовать названию категории добавленной ранее');\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация события должна соответствовать аннотации события с указанным идентификатором');\r",
+ " pm.expect(source.category.id).equal(target.category.id, 'Категория события должна соответствовать категории события с указанным идентификатором');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость события должна соответствовать стоимости события с указанным идентификатором');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения события должна соответствовать дате проведения события с указанным идентификатором');\r",
+ " pm.expect(source.description).equal(target.description, 'Описание события должно соответствовать описанию события с указанным идентификатором');\r",
+ " pm.expect(source.title).equal(target.title, 'Название события должно соответствовать названию события с указанным идентификатором');\r",
+ " pm.expect(source.participantLimit.toString()).equal(target.participantLimit.toString(), 'Лимит участников события должен соответствовать лимиту участников события с указанным идентификатором');\r",
"});"
],
"type": "text/javascript"
@@ -3802,31 +10298,28 @@
}
],
"url": {
- "raw": "{{baseUrl}}/categories?from=0&size=1000",
+ "raw": "{{baseUrl}}/events/:id",
"host": [
"{{baseUrl}}"
],
"path": [
- "categories"
+ "events",
+ ":id"
],
- "query": [
- {
- "key": "from",
- "value": "0",
- "description": "количество категорий, которые нужно пропустить для формирования текущего набора"
- },
+ "variable": [
{
- "key": "size",
- "value": "1000",
- "description": "количество категорий в наборе"
+ "key": "id",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
- }
+ },
+ "description": "Обратите внимание:\n- событие должно быть опубликовано\n- информация о событии должна включать в себя количество просмотров и количество подтвержденных запросов\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики"
},
"response": []
},
{
- "name": "Получение информации о категории по её идентификатору",
+ "name": "Получение полной информации о событии добавленном текущим пользователем",
"event": [
{
"listen": "prerequest",
@@ -3837,9 +10330,11 @@
" const rnd = new RandomUtils();\r",
"\r",
" try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " pm.collectionVariables.set(\"uid\", user.id)\r",
" const category = await api.addCategory(rnd.getCategory());\r",
- " pm.collectionVariables.set(\"response\", category)\r",
- " pm.collectionVariables.set(\"catid\", category.id)\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -3873,17 +10368,26 @@
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const source = pm.collectionVariables.get('response');\r",
"const target = pm.response.json();\r",
"\r",
- "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, description, participantLimit, state, createdOn, location, requestModeration\", function () {\r",
"pm.expect(target).to.have.property('id');\r",
- "pm.expect(target).to.have.property('name');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(source.id).equal(target.id, 'Идентификатор категории должен соответствовать идентификатору в запросе');\r",
- " pm.expect(source.name).equal(target.name, 'Название категории должно соответствовать названию категории с указанным идентификатором');\r",
+ " pm.expect(target.id).to.not.be.null;\r",
"});"
],
"type": "text/javascript"
@@ -3899,19 +10403,26 @@
}
],
"url": {
- "raw": "{{baseUrl}}/categories/:catId",
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "categories",
- ":catId"
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}",
- "description": "(Required) id категории"
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
}
@@ -3919,7 +10430,7 @@
"response": []
},
{
- "name": "Удаление категории",
+ "name": "Редактирование данных события и его статуса (отклонение/публикация).",
"event": [
{
"listen": "prerequest",
@@ -3930,10 +10441,18 @@
" const rnd = new RandomUtils();\r",
"\r",
" try {\r",
+ " const user = await api.addUser(rnd.getUser());\r",
" const category = await api.addCategory(rnd.getCategory());\r",
- " const findedCategory = await api.findCategory(category.id);\r",
- " pm.collectionVariables.set(\"catid\", category.id)\r",
- " pm.collectionVariables.set(\"response\", findedCategory)\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " let event2 = rnd.getEvent(category.id)\r",
+ " event2.stateAction = \"PUBLISH_EVENT\"\r",
+ " pm.collectionVariables.set('response', event2);\r",
+ " pm.collectionVariables.set(\"eid\", event.id)\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: event2,\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -3944,6 +10463,7 @@
"setTimeout(async () => \r",
" {\r",
" try {\r",
+ " // выполняем наш скрипт\r",
" await main();\r",
" } catch (e) {\r",
" console.error(e);\r",
@@ -3961,61 +10481,81 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 204\", function () {\r",
- " pm.response.to.have.status(204);\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
"});\r",
"\r",
- "source = pm.collectionVariables.get('response');\r",
- "catId = pm.collectionVariables.get('catid');\r",
+ "const source = pm.collectionVariables.get('response');\r",
+ "const target = pm.response.json();\r",
"\r",
- "pm.test(\"Категория должна быть найдена до удаления\", function () {\r",
- " pm.expect(source.id).equal(catId, 'Идентификтор категории должен совпадать с удаляемым');\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r",
+ "pm.expect(target).to.have.property('id');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('publishedOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
- "pm.sendRequest({\r",
- " url: pm.collectionVariables.get(\"baseUrl\") + \"/categories/\" + catId,\r",
- " method: 'GET',\r",
- " }, (error, response) => {\r",
- " pm.test(\"Категория не должна быть найдена после удаления\", function () {\r",
- " pm.expect(response.code).to.eql(404);\r",
- " });\r",
- " });"
+ "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация события должна соответствовать искомому событию');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость события должна соответствовать искомому событию');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения события должна соответствовать искомому событию');\r",
+ " pm.expect(source.description).equal(target.description, 'Описание события должно соответствовать искомому событию');\r",
+ " pm.expect(source.title).equal(target.title, 'Название события должно соответствовать искомому событию');\r",
+ " pm.expect(source.participantLimit.toString()).equal(target.participantLimit.toString(), 'Лимит участников события должен соответствовать искомому событию');\r",
+ "});"
],
"type": "text/javascript"
}
}
],
"request": {
- "method": "DELETE",
+ "method": "PATCH",
"header": [
{
"key": "Accept",
"value": "application/json"
}
],
+ "body": {
+ "mode": "raw",
+ "raw": "{{request_body}}"
+ },
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/admin/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
"admin",
- "categories",
- ":catId"
+ "events",
+ ":eventId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id события"
}
]
},
- "description": "Обратите внимание: с категорий не должно быть связано ни одного события."
+ "description": "Обратите внимание:\n - дата начала события должна быть не ранее чем за час от даты публикации.\n- событие должно быть в состоянии ожидания публикации"
},
"response": []
},
{
- "name": "Изменение категории",
+ "name": "Изменение события добавленного текущим пользователем",
"event": [
{
"listen": "prerequest",
@@ -4024,20 +10564,24 @@
"const main = async () => {\r",
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
- " let category\r",
+ "\r",
" try {\r",
- " category = await api.addCategory(rnd.getCategory());\r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " const event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " pm.collectionVariables.set(\"uid\", user.id);\r",
+ " pm.collectionVariables.set(\"eid\", event.id);\r",
+ " pm.collectionVariables.set(\"response\", event);\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify({\r",
+ " stateAction: \"CANCEL_REVIEW\"\r",
+ " }),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
- " pm.collectionVariables.set(\"catid\", Number(category.id))\r",
- " pm.request.body.update({\r",
- " mode: 'raw',\r",
- " raw: JSON.stringify({\r",
- " name : rnd.getCategory().name\r",
- " }),\r",
- " options: { raw: { language: 'json' } }\r",
- " });\r",
"};\r",
"\r",
"const interval = setInterval(() => {}, 1000);\r",
@@ -4068,17 +10612,40 @@
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const source = JSON.parse(pm.request.body.raw);\r",
+ "const source = pm.collectionVariables.get(\"response\");\r",
"const target = pm.response.json();\r",
"\r",
- "pm.test(\"Категория должна содержать поля: id, name\", function () {\r",
+ "\r",
+ "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, description, participantLimit, state, createdOn, location, requestModeration\", function () {\r",
"pm.expect(target).to.have.property('id');\r",
- "pm.expect(target).to.have.property('name');\r",
+ "pm.expect(target).to.have.property('title');\r",
+ "pm.expect(target).to.have.property('annotation');\r",
+ "pm.expect(target).to.have.property('category');\r",
+ "pm.expect(target).to.have.property('paid');\r",
+ "pm.expect(target).to.have.property('eventDate');\r",
+ "pm.expect(target).to.have.property('initiator');\r",
+ "pm.expect(target).to.have.property('description');\r",
+ "pm.expect(target).to.have.property('participantLimit');\r",
+ "pm.expect(target).to.have.property('state');\r",
+ "pm.expect(target).to.have.property('createdOn');\r",
+ "pm.expect(target).to.have.property('location');\r",
+ "pm.expect(target).to.have.property('requestModeration');\r",
"});\r",
"\r",
"pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r",
- " pm.expect(target.id).to.not.be.null;\r",
- " pm.expect(source.name).equal(target.name, 'Название категории должно совпадать с отправленным');\r",
+ " pm.expect(source.annotation).equal(target.annotation, 'Аннотация отменённого события должна соответствовать аннотации события до отмены');\r",
+ " pm.expect(source.category.id).equal(target.category.id, 'Категория отменённого события должна соответствовать категории события до отмены');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость отменённого события должна соответствовать стоимости события до отмены');\r",
+ " pm.expect(source.eventDate).equal(target.eventDate, 'Дата проведения отменённого события должна соответствовать дате проведения события до отмены');\r",
+ " pm.expect(source.description).equal(target.description, 'Описание отменённого события должно соответствовать описанию события до отмены');\r",
+ " pm.expect(source.title).equal(target.title, 'Название отменённого события должно соответствовать названию события до отмены');\r",
+ " pm.expect(source.participantLimit.toString()).equal(target.participantLimit.toString(), 'Лимит участников отменённого события должен соответствовать лимиту участников события до отмены');\r",
+ " pm.expect(source.paid.toString()).equal(target.paid.toString(), 'Стоимость отменённого события должна соответствовать стоимости события до отмены');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Событие должно иметь статус PENDING при создании и статус CANCELED после выполнения запроса\", function () {\r",
+ " pm.expect(source.state).equal(\"PENDING\");\r",
+ " pm.expect(target.state).equal(\"CANCELED\");\r",
"});"
],
"type": "text/javascript"
@@ -4087,28 +10654,50 @@
],
"request": {
"method": "PATCH",
- "header": [],
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ },
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
"body": {
"mode": "raw",
- "raw": "{{request_body}}"
+ "raw": "{{request_body}}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
},
"url": {
- "raw": "{{baseUrl}}/admin/categories/:catId",
+ "raw": "{{baseUrl}}/users/:userId/events/:eventId",
"host": [
"{{baseUrl}}"
],
"path": [
- "admin",
- "categories",
- ":catId"
+ "users",
+ ":userId",
+ "events",
+ ":eventId"
],
"variable": [
{
- "key": "catId",
- "value": "{{catid}}"
+ "key": "userId",
+ "value": "{{uid}}",
+ "description": "(Required) id текущего пользователя"
+ },
+ {
+ "key": "eventId",
+ "value": "{{eid}}",
+ "description": "(Required) id отменяемого события"
}
]
- }
+ },
+ "description": "Обратите внимание: Отменить можно только событие в состоянии ожидания модерации."
},
"response": []
}
diff --git a/postman/ewm-stat-service.json b/postman/ewm-stat-service.json
index 6707a74..08614b5 100644
--- a/postman/ewm-stat-service.json
+++ b/postman/ewm-stat-service.json
@@ -1,13 +1,14 @@
{
"info": {
- "_postman_id": "2727ee6b-c606-49ec-9d4b-549c21dbe7ae",
- "name": "Tests for detatched stats service",
+ "_postman_id": "f5371ebb-b14e-45d3-bf4c-f72a79f56ea0",
+ "name": "\"Explore with me\" API статистика",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
- "_exporter_id": "23073145"
+ "_exporter_id": "27311667",
+ "_collection_link": "https://api555-4802.postman.co/workspace/explore-with-me~26332bb9-fe8e-403d-8af2-e0d94c187194/collection/27311667-f5371ebb-b14e-45d3-bf4c-f72a79f56ea0?action=share&source=collection_link&creator=27311667"
},
"item": [
{
- "name": "Получение статистики по посещениям. (Тест на опциональность параметра uris)",
+ "name": "Сохранение информации о том, что к эндпоинту был запрос",
"event": [
{
"listen": "prerequest",
@@ -17,17 +18,117 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " try { \r",
- " pm.collectionVariables.set(\"uri\", '/events'); \r",
- " let post1 = rnd.getPost();\r",
- " let post2 = rnd.getPost();\r",
- " post1['uri'] = '/events';\r",
- " post2['uri'] = '/events/5';\r",
- " await api.addPost(post1);\r",
- " await api.addPost(post2);\r",
- "\r",
- " let source = await api.getPosts(['/events']);\r",
- " pm.collectionVariables.set('source', source);\r",
+ " let post;\r",
+ " try {\r",
+ " post = rnd.getPost();\r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "\r",
+ " pm.request.body.update({\r",
+ " mode: 'raw',\r",
+ " raw: JSON.stringify(post),\r",
+ " options: { raw: { language: 'json' } }\r",
+ " });\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r",
+ " pm.response.to.have.status(201);\r",
+ "});\r",
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "{{baseUrl}}/hit",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "hit"
+ ]
+ },
+ "description": "Сохранение информации о том, что на uri конкретного сервиса был отправлен запрос пользователем. Название сервиса, uri и ip пользователя указаны в теле запроса."
+ },
+ "response": []
+ },
+ {
+ "name": "Получение статистики по посещениям. Обратите внимание: значение даты и времени нужно закодировать (например используя java.net.URLEncoder.encode)(Тест на /events/{id})",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try { \r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event = await api.publishEvent(event.id);\r",
+ " pm.collectionVariables.set(\"uri\", '/events/' + event.id);\r",
+ "\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events/\" + event.id,\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events/\" + event.id.toString() + \"&unique=false\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.collectionVariables.set('source', response.json());\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events/\" + event.id,\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " });\r",
+ " });\r",
+ " });\r",
" \r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
@@ -56,27 +157,157 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json при запросе без опционального параметра uris\", function () {\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
" pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const target = pm.response.json();\r",
- "const source = pm.collectionVariables.get('source');\r",
+ "const target = pm.response.json()[0];\r",
"\r",
- "pm.test(\"При запросе по конкретному uris должны получить 1 запись\", function () {\r",
- " pm.expect(source.length).to.equal(1);\r",
+ "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r",
+ " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r",
"});\r",
"\r",
- "pm.test(\"При запросе без uris должны получить больше 1 записи\", function () {\r",
- " pm.expect(target.length).to.be.above(1);\r",
+ "const source = pm.collectionVariables.get(\"source\")[0];\r",
+ "\r",
+ "\r",
+ "pm.test(\"После выполнения запроса GET /events/{id} должно увеличиться количество хитов.\", function(){\r",
+ " pm.expect(source.hits + 1).equal(target.hits, 'Количество хитов после выполнения запроса GET /events/{id} должно быть больше на 1.');\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}&unique=false",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "stats"
+ ],
+ "query": [
+ {
+ "key": "start",
+ "value": "2020-05-05 00:00:00",
+ "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "end",
+ "value": "2035-05-05 00:00:00",
+ "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "uris",
+ "value": "{{uri}}",
+ "description": "Список uri для которых нужно выгрузить статистику"
+ },
+ {
+ "key": "unique",
+ "value": "false",
+ "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)"
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Тест взаимодействия сервисов",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ "const main = async () => {\r",
+ " const api = new API(pm);\r",
+ " const rnd = new RandomUtils();\r",
+ "\r",
+ " try { \r",
+ " const user = await api.addUser(rnd.getUser());\r",
+ " const category = await api.addCategory(rnd.getCategory());\r",
+ " let event1 = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event1 = await api.publishEvent(event1.id);\r",
+ " let event2 = await api.addEvent(user.id, rnd.getEvent(category.id));\r",
+ " event2 = await api.publishEvent(event2.id);\r",
+ " pm.collectionVariables.set(\"uri\", '/events/' + event1.id + '&uris=/events/' + event2.id);\r",
+ "\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events/\" + event1.id,\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events/\" + event2.id,\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events/\" + event2.id,\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " });\r",
+ " });\r",
+ " });\r",
+ " \r",
+ " } catch(err) {\r",
+ " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
+ " }\r",
+ "};\r",
+ "\r",
+ "const interval = setInterval(() => {}, 1000);\r",
+ "\r",
+ "setTimeout(async () => \r",
+ " {\r",
+ " try {\r",
+ " await main();\r",
+ " } catch (e) {\r",
+ " console.error(e);\r",
+ " } finally {\r",
+ " clearInterval(interval);\r",
+ " }\r",
+ " }, \r",
+ " 100 \r",
+ ");"
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ " pm.response.to.be.ok; \r",
+ " pm.response.to.be.withBody;\r",
+ " pm.response.to.be.json;\r",
"});\r",
"\r",
+ "const target = pm.response.json();\r",
+ "\r",
"pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r",
" pm.expect(target[0]).to.have.all.keys('app', 'uri', 'hits');\r",
" pm.expect(target[1]).to.have.all.keys('app', 'uri', 'hits');\r",
- " pm.expect(source[0]).to.have.all.keys('app', 'uri', 'hits');\r",
+ "});\r",
+ "\r",
+ "pm.test(\"В теле ответа должна соблюдаться сортировка по убыванию количества просмотров\", function(){\r",
+ " pm.expect(target[0].hits).to.be.above(target[1].hits);\r",
+ "});\r",
+ "\r",
+ "pm.test(\"Проверка соответствия реального количества просмотров событий и сохраненных хитов\", function(){\r",
+ " pm.expect(target[0].hits).equal(2);\r",
+ " pm.expect(target[1].hits).equal(1);\r",
"});"
],
"type": "text/javascript"
@@ -92,7 +323,7 @@
}
],
"url": {
- "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&unique=false",
+ "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}",
"host": [
"{{baseUrl}}"
],
@@ -113,8 +344,7 @@
{
"key": "uris",
"value": "{{uri}}",
- "description": "Список uri для которых нужно выгрузить статистику",
- "disabled": true
+ "description": "Список uri для которых нужно выгрузить статистику"
},
{
"key": "uris",
@@ -125,7 +355,8 @@
{
"key": "unique",
"value": "false",
- "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)"
+ "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)",
+ "disabled": true
}
]
}
@@ -133,7 +364,7 @@
"response": []
},
{
- "name": "Получение статистики по посещениям. (Тест на опциональность и работу параметра unique)",
+ "name": "Получение статистики по посещениям. Обратите внимание: значение даты и времени нужно закодировать (например используя java.net.URLEncoder.encode)(Тест на /events)",
"event": [
{
"listen": "prerequest",
@@ -145,15 +376,27 @@
"\r",
" try { \r",
" pm.collectionVariables.set(\"uri\", '/events'); \r",
- " let post = rnd.getPost();\r",
- " post['uri'] = '/events';\r",
- " await api.addPost(post);\r",
- " await api.addPost(post);\r",
- " await api.addPost(post);\r",
" \r",
- " let source = await api.getPosts(['/events']);\r",
- " pm.collectionVariables.set('source', source);\r",
- "\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " \r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events&unique=false\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.collectionVariables.set('source', response.json());\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " });\r",
+ " });\r",
+ " });\r",
+ " \r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -181,26 +424,23 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json при запросе без опционального параметра unique\", function () {\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
" pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
"const target = pm.response.json()[0];\r",
- "const source = pm.collectionVariables.get('source')[0];\r",
"\r",
- "pm.test(\"При запросе с unique==true должен быть всего 1 уникальный запрос\", function () {\r",
- " pm.expect(target.hits).to.equal(1);\r",
+ "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r",
+ " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r",
"});\r",
"\r",
- "pm.test(\"При запросе без uniqre должны получить минимум 3 запроса(поскольку делали 3)\", function () {\r",
- " pm.expect(source.hits).to.be.above(2);\r",
- "});\r",
+ "const source = pm.collectionVariables.get(\"source\")[0];\r",
"\r",
- "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r",
- " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r",
- " pm.expect(source).to.have.all.keys('app', 'uri', 'hits');\r",
+ "\r",
+ "pm.test(\"После выполнения запроса GET /events должно увеличиться количество хитов.\", function(){\r",
+ " pm.expect(source.hits + 1).equal(target.hits, 'Количество хитов после выполнения запроса GET /events должно быть больше на 1.');\r",
"});"
],
"type": "text/javascript"
@@ -216,7 +456,7 @@
}
],
"url": {
- "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}&unique=true",
+ "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}&unique=false",
"host": [
"{{baseUrl}}"
],
@@ -239,15 +479,9 @@
"value": "{{uri}}",
"description": "Список uri для которых нужно выгрузить статистику"
},
- {
- "key": "uris",
- "value": "aliqua o",
- "description": "Список uri для которых нужно выгрузить статистику",
- "disabled": true
- },
{
"key": "unique",
- "value": "true",
+ "value": "false",
"description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)"
}
]
@@ -256,7 +490,7 @@
"response": []
},
{
- "name": "Тест корреткной работы сохранения и просмотра количества просмотров",
+ "name": "Получение статистики по посещениям. (Тест на опциональность и работу параметра unique)",
"event": [
{
"listen": "prerequest",
@@ -266,20 +500,29 @@
" const api = new API(pm);\r",
" const rnd = new RandomUtils();\r",
"\r",
- " try {\r",
- " pm.collectionVariables.set(\"uri\", '/events/1&uris=/events/2');\r",
- " let post1 = rnd.getPost();\r",
- " let post2 = rnd.getPost();\r",
- " post1['uri'] = '/events/1';\r",
- " post2['uri'] = '/events/2';\r",
- " await api.addPost(post1);\r",
- " await api.addPost(post2);\r",
- " await api.addPost(post2);\r",
- " let source = await api.getPosts(['/events/1', '/events/2']);\r",
- " await api.addPost(post1);\r",
- " await api.addPost(post2);\r",
- " pm.collectionVariables.set('source', source);\r",
+ " try { \r",
+ " pm.collectionVariables.set(\"uri\", '/events'); \r",
" \r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:8080/events\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " \r",
+ " pm.sendRequest({\r",
+ " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events&unique=true\",\r",
+ " method : \"GET\",\r",
+ " header: { \"Content-Type\": \"application/json\" }\r",
+ " }, (error, response) => {\r",
+ " pm.collectionVariables.set('source', response.json());\r",
+ " });\r",
+ " });\r",
+ " });\r",
" } catch(err) {\r",
" console.error(\"Ошибка при подготовке тестовых данных.\", err);\r",
" }\r",
@@ -307,29 +550,27 @@
"listen": "test",
"script": {
"exec": [
- "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r",
+ "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json при запросе без опционального параметра unique\", function () {\r",
" pm.response.to.be.ok; \r",
" pm.response.to.be.withBody;\r",
" pm.response.to.be.json;\r",
"});\r",
"\r",
- "const target = pm.response.json();\r",
- "const source = pm.collectionVariables.get('source');\r",
- "\r",
+ "const target = pm.response.json()[0];\r",
"\r",
"pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r",
- " pm.expect(target[0]).to.have.all.keys('app', 'uri', 'hits');\r",
- " pm.expect(target[1]).to.have.all.keys('app', 'uri', 'hits');\r",
+ " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r",
"});\r",
"\r",
- "pm.test(\"В теле ответа должна соблюдаться сортировка по убыванию количества просмотров\", function(){\r",
- " pm.expect(target[0].hits).to.be.above(target[1].hits);\r",
- "});\r",
+ "const source = pm.collectionVariables.get(\"source\")[0];\r",
"\r",
- "pm.test(\"Проверка соответствия реального количества просмотров событий и сохраненных хитов\", function(){\r",
- " pm.expect(source[0].hits+1).equal(target[0].hits);\r",
- " pm.expect(source[1].hits+1).equal(target[1].hits);\r",
- "});"
+ "pm.test(\"Количество уникальных просмотров с одного ip должно равняться 1\", function () {\r",
+ " pm.expect(source.hits == 1);\r",
+ "})\r",
+ "\r",
+ "pm.test(\"Количество просмотров с одного ip должно быть больше 1\", function () {\r",
+ " pm.expect(target.hits > 1);\r",
+ "})"
],
"type": "text/javascript"
}
@@ -383,6 +624,209 @@
}
},
"response": []
+ },
+ {
+ "name": "Получение статистики по посещениям. (Тест на верную обработку запроса с неверными датами начала и конца диапазона времени)",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.be.badRequest;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/stats?start=2035-05-05 00:00:00&end=2020-05-05 00:00:00&uris={{uri}}",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "stats"
+ ],
+ "query": [
+ {
+ "key": "start",
+ "value": "2035-05-05 00:00:00",
+ "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "end",
+ "value": "2020-05-05 00:00:00",
+ "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "uris",
+ "value": "{{uri}}",
+ "description": "Список uri для которых нужно выгрузить статистику"
+ },
+ {
+ "key": "unique",
+ "value": "false",
+ "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Тест на верную обработку запроса без даты начала",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.be.badRequest;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/stats?end=2020-05-05 00:00:00&uris={{uri}}",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "stats"
+ ],
+ "query": [
+ {
+ "key": "start",
+ "value": "2035-05-05 00:00:00",
+ "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")",
+ "disabled": true
+ },
+ {
+ "key": "end",
+ "value": "2020-05-05 00:00:00",
+ "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "uris",
+ "value": "{{uri}}",
+ "description": "Список uri для которых нужно выгрузить статистику"
+ },
+ {
+ "key": "unique",
+ "value": "false",
+ "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Тест на верную обработку запроса без даты конца",
+ "event": [
+ {
+ "listen": "prerequest",
+ "script": {
+ "exec": [
+ ""
+ ],
+ "type": "text/javascript"
+ }
+ },
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r",
+ " pm.response.to.be.badRequest;\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Accept",
+ "value": "application/json"
+ }
+ ],
+ "url": {
+ "raw": "{{baseUrl}}/stats?start=2035-05-05 00:00:00&uris={{uri}}",
+ "host": [
+ "{{baseUrl}}"
+ ],
+ "path": [
+ "stats"
+ ],
+ "query": [
+ {
+ "key": "start",
+ "value": "2035-05-05 00:00:00",
+ "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")"
+ },
+ {
+ "key": "end",
+ "value": "2020-05-05 00:00:00",
+ "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")",
+ "disabled": true
+ },
+ {
+ "key": "uris",
+ "value": "{{uri}}",
+ "description": "Список uri для которых нужно выгрузить статистику"
+ },
+ {
+ "key": "unique",
+ "value": "false",
+ "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "response": []
}
],
"event": [
@@ -402,28 +846,48 @@
" return this.post(\"/hit\", post, \"Ошибка при сохранении информации о запросе к эндпойнту: \", verbose);",
" }",
"",
- " async getPosts(uris=null, verbose=null) {",
- " return this.get(uris == null ? \"/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00\" : \"/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=\"+uris.join('&uris='), null, \"Ошибка при сохранении информации о запросе к эндпойнту: \", verbose);",
+ " async addUser(user, verbose=null) {",
+ " return this.post(\"/admin/users\", user, \"http://localhost:8080\", \"Ошибка при добавлении нового пользователя: \", verbose);",
+ " }",
+ "",
+ " async addCategory(category, verbose=null) {",
+ " return this.post(\"/admin/categories\", category, \"http://localhost:8080\", \"Ошибка при добавлении новой категории: \", verbose);",
" }",
"",
- " async post(path, body, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {",
- " return this.sendRequest(\"POST\", path, body, errorText);",
+ " async addEvent(userId, event, verbose=null) {",
+ " return this.post(\"/users/\" + userId + \"/events\", event, \"http://localhost:8080\", \"Ошибка при добавлении нового события: \", verbose);",
" }",
"",
- " async get(path, body = null, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {",
- " return this.sendRequest(\"GET\", path, body, errorText);",
+ " async publishEvent(eventId, verbose=null) {",
+ " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"},\"Ошибка при публикации события\", verbose);",
" }",
"",
- " async sendRequest(method, path, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {",
+ " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {",
+ " return this.sendRequest(\"PATCH\", path, \"http://localhost:8080\", body, errorText);",
+ " }",
+ "",
+ " async post(path, body, newBaseUrl=null, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {",
+ " return this.sendRequest(\"POST\", path, newBaseUrl, body, errorText);",
+ " }",
+ "",
+ " async sendRequest(method, path, newBaseUrl=null, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {",
" return new Promise((resolve, reject) => {",
" verbose = verbose == null ? this._verbose : verbose;",
- "",
- " let request = {",
- " url: this.baseUrl + path,",
- " method: method,",
- " body: body == null ? \"\" : JSON.stringify(body),",
- " header: { \"Content-Type\": \"application/json\" },",
- " };",
+ " let request;",
+ " if (newBaseUrl==null)",
+ " request = {",
+ " url: this.baseUrl + path,",
+ " method: method,",
+ " body: body == null ? \"\" : JSON.stringify(body),",
+ " header: { \"Content-Type\": \"application/json\" },",
+ " };",
+ " else",
+ " request = {",
+ " url: newBaseUrl + path,",
+ " method: method,",
+ " body: body == null ? \"\" : JSON.stringify(body),",
+ " header: { \"Content-Type\": \"application/json\" },",
+ " };",
"",
" if(verbose) {",
" console.log(\"Отправляю запрос: \", request);",
@@ -467,11 +931,49 @@
" return {",
" app: \"ewm-main-service\",",
" uri: \"/events/\" + pm.variables.replaceIn('{{$randomInt}}'),",
- " ip: '121.0.0.1',",
+ " ip: pm.variables.replaceIn('{{$randomIP}}'),",
" timestamp: this.getPastDateTime()",
" }",
" }",
"",
+ " getUser() {",
+ " return {",
+ " name: pm.variables.replaceIn('{{$randomFullName}}'),",
+ " email: pm.variables.replaceIn('{{$randomEmail}}')",
+ " };",
+ " }",
+ "",
+ " getCategory() {",
+ " return {",
+ " name: pm.variables.replaceIn('{{$randomWord}}') + Math.floor(Math.random() * 100).toString()",
+ " };",
+ " }",
+ "",
+ " getEvent(categoryId) {",
+ " return {",
+ " annotation: pm.variables.replaceIn('{{$randomLoremParagraph}}'),",
+ " category: categoryId,",
+ " description: pm.variables.replaceIn('{{$randomLoremParagraphs}}'),",
+ " eventDate: this.getFutureDateTime(),",
+ " location: {",
+ " lat: parseFloat(pm.variables.replaceIn('{{$randomLatitude}}')),",
+ " lon: parseFloat(pm.variables.replaceIn('{{$randomLongitude}}')),",
+ " },",
+ " paid: pm.variables.replaceIn('{{$randomBoolean}}'),",
+ " participantLimit: pm.variables.replaceIn('{{$randomInt}}'),",
+ " requestModeration: pm.variables.replaceIn('{{$randomBoolean}}'),",
+ " title: pm.variables.replaceIn('{{$randomLoremSentence}}'),",
+ " }",
+ " }",
+ " ",
+ " getCompilation(...eventIds) { ",
+ " return { ",
+ " title: pm.variables.replaceIn('{{$randomLoremSentence}}'), ",
+ " pinned: pm.variables.replaceIn('{{$randomBoolean}}'), ",
+ " events: eventIds ",
+ " }; ",
+ " }",
+ "",
" getPastDateTime(hourShift = 5, minuteShift=0, yearShift=0) {",
" let moment = require('moment');",
"",
@@ -483,6 +985,16 @@
" return m.format('YYYY-MM-DD HH:mm:ss');",
" }",
"",
+ " getFutureDateTime(hourShift = 5, minuteShift=0, yearShift=0) {",
+ " let moment = require('moment');",
+ "",
+ " let m = moment();",
+ " m.add(hourShift, 'hour');",
+ " m.add(minuteShift, 'minute');",
+ " m.add(yearShift, 'year');",
+ "",
+ " return m.format('YYYY-MM-DD HH:mm:ss');",
+ " }",
"}"
]
}
@@ -512,4 +1024,4 @@
"value": ""
}
]
-}
+}
\ No newline at end of file