DiningMenuAPIService.java

1
package edu.ucsb.cs156.dining.services;
2
3
import com.fasterxml.jackson.databind.ObjectMapper;
4
5
import java.time.OffsetDateTime;
6
import java.time.format.DateTimeFormatter;
7
import java.util.Arrays;
8
import lombok.extern.slf4j.Slf4j;
9
import org.springframework.beans.factory.annotation.Autowired;
10
import org.springframework.beans.factory.annotation.Value;
11
import org.springframework.boot.web.client.RestTemplateBuilder;
12
import org.springframework.http.HttpEntity;
13
import org.springframework.http.HttpHeaders;
14
import org.springframework.http.HttpMethod;
15
import org.springframework.http.HttpStatus;
16
import org.springframework.http.MediaType;
17
import org.springframework.http.ResponseEntity;
18
import org.springframework.stereotype.Service;
19
import org.springframework.web.client.HttpClientErrorException;
20
import org.springframework.web.client.HttpServerErrorException;
21
import org.springframework.web.client.RestTemplate;
22
import org.springframework.web.server.ResponseStatusException;
23
24
@Service
25
@Slf4j
26
public class DiningMenuAPIService {
27
  @Value("${app.startDate:2024-01-01T00:00:00-08:00}")
28
  private OffsetDateTime startDate;
29
30
  @Value("${app.endDate:2024-12-31T23:59:59-08:00}")
31
  private OffsetDateTime endDate;
32
33
  @Autowired private ObjectMapper objectMapper;
34
35
  @Value("${app.ucsb.api.key}")
36
  private String apiKey;
37
38
  private RestTemplate restTemplate;
39
40
  public DiningMenuAPIService(RestTemplateBuilder restTemplateBuilder) throws Exception {
41
    this.restTemplate = restTemplateBuilder.build();
42
  }
43
44
  public static final String GET_DAYS =
45
      "https://api.ucsb.edu/dining/menu/v1/";
46
47
  public static final String GET_COMMONS =
48
      "https://api.ucsb.edu/dining/menu/v1/{date-time}";
49
50
  public static final String GET_MEALS =
51
      "https://api.ucsb.edu/dining/menu/v1/{date-time}/{dining-common-code}";
52
53
  public String getDays() throws Exception {
54
    HttpHeaders headers = new HttpHeaders();
55 1 1. getDays : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
56 1 1. getDays : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED
    headers.setContentType(MediaType.APPLICATION_JSON);
57 1 1. getDays : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-version", "1.0");
58 1 1. getDays : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-key", this.apiKey);
59
60
    HttpEntity<String> entity = new HttpEntity<>("body", headers);
61
62
    String url = GET_DAYS;
63
    log.info("url=" + url);
64
65
    String retVal = "";
66
    MediaType contentType = null;
67
    HttpStatus statusCode = null;
68
69
    ResponseEntity<String> re = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
70
    contentType = re.getHeaders().getContentType();
71
    statusCode = (HttpStatus) re.getStatusCode();
72
    retVal = re.getBody();
73
74
    log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode);
75 1 1. getDays : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getDays → KILLED
    return retVal;
76
  }
77
78
  public String getCommons(OffsetDateTime dateTime) {
79
    HttpHeaders headers = new HttpHeaders();
80 1 1. getCommons : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
81 1 1. getCommons : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED
    headers.setContentType(MediaType.APPLICATION_JSON);
82 1 1. getCommons : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-version", "1.0");
83 1 1. getCommons : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-key", this.apiKey);
84
85
    HttpEntity<String> entity = new HttpEntity<>("body", headers);
86
87
    DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
88
    String formattedDateTime = dateTime.format(formatter);
89
90
    String url = GET_COMMONS
91
                .replace("{date-time}", formattedDateTime);
92
93
    log.info("url=" + url);
94
95
    String retVal = "";
96
    MediaType contentType = null;
97
    HttpStatus statusCode = null;
98
99
    ResponseEntity<String> re =
100
        restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
101
    contentType = re.getHeaders().getContentType();
102
    statusCode = (HttpStatus) re.getStatusCode();
103
    retVal = re.getBody();
104
105 1 1. getCommons : negated conditional → KILLED
    if (retVal.equals("null"))
106
    {
107
      retVal = "{\"error\": \"Commons doesn't serve meals on given day.\"}";
108
    }
109
110
    log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode);
111 1 1. getCommons : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getCommons → KILLED
    return retVal;
112
  } 
113
114
  public String getMeals(OffsetDateTime dateTime, String diningCommonCode) {
115
    HttpHeaders headers = new HttpHeaders();
116 1 1. getMeals : removed call to org/springframework/http/HttpHeaders::setAccept → KILLED
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
117 1 1. getMeals : removed call to org/springframework/http/HttpHeaders::setContentType → KILLED
    headers.setContentType(MediaType.APPLICATION_JSON);
118 1 1. getMeals : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-version", "1.0");
119 1 1. getMeals : removed call to org/springframework/http/HttpHeaders::set → KILLED
    headers.set("ucsb-api-key", this.apiKey);
120
121
    HttpEntity<String> entity = new HttpEntity<>("body", headers);
122
123
    DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
124
    String formattedDateTime = dateTime.format(formatter);
125
126
    String url = GET_MEALS
127
                .replace("{date-time}", formattedDateTime)
128
                .replace("{dining-common-code}", diningCommonCode);
129
130
    log.info("url=" + url);
131
132
    String retVal = "";
133
    MediaType contentType = null;
134
    HttpStatus statusCode = null;
135
136
    ResponseEntity<String> re =
137
        restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
138
    contentType = re.getHeaders().getContentType();
139
    statusCode = (HttpStatus) re.getStatusCode();
140
    retVal = re.getBody();
141
142 1 1. getMeals : negated conditional → KILLED
    if (retVal.equals("null"))
143
    {
144
      retVal = "{\"error\": \"Meals are not served at given commons on given day.\"}";
145
    }
146
147
      log.info("json: {} contentType: {} statusCode: {}", retVal, contentType, statusCode);
148 1 1. getMeals : replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getMeals → KILLED
      return retVal;
149
  } 
150
}

Mutations

55

1.1
Location : getDays
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetDays()]
removed call to org/springframework/http/HttpHeaders::setAccept → KILLED

56

1.1
Location : getDays
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetDays()]
removed call to org/springframework/http/HttpHeaders::setContentType → KILLED

57

1.1
Location : getDays
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetDays()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

58

1.1
Location : getDays
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetDays()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

75

1.1
Location : getDays
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetDays()]
replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getDays → KILLED

80

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
removed call to org/springframework/http/HttpHeaders::setAccept → KILLED

81

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
removed call to org/springframework/http/HttpHeaders::setContentType → KILLED

82

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

83

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

105

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
negated conditional → KILLED

111

1.1
Location : getCommons
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetCommons_success()]
replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getCommons → KILLED

116

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
removed call to org/springframework/http/HttpHeaders::setAccept → KILLED

117

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
removed call to org/springframework/http/HttpHeaders::setContentType → KILLED

118

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

119

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
removed call to org/springframework/http/HttpHeaders::set → KILLED

142

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
negated conditional → KILLED

148

1.1
Location : getMeals
Killed by : edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.services.DiningMenuAPIServiceTests]/[method:testGetMeals_failure()]
replaced return value with "" for edu/ucsb/cs156/dining/services/DiningMenuAPIService::getMeals → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0