def _get_mock_dataframe(self, user): two_months_ago = get_current_date_months_ago(2) one_month_ago = get_current_date_months_ago(1) default_index = pd.date_range(start=two_months_ago, end=one_month_ago, freq='D') random_values = [randint(0, 3) for _ in default_index] mock_dataframe = pd.DataFrame(index=default_index, data=random_values) mock_dataframe = mock_dataframe.tz_localize(user.pytz_timezone) return mock_dataframe
def _get_mock_dataframe(self, user): two_months_ago = get_current_date_months_ago(2) one_month_ago = get_current_date_months_ago(1) default_index = pd.date_range(start=two_months_ago, end=one_month_ago, freq='D') random_values = [randint(0, 3) for _ in default_index] mock_dataframe = pd.DataFrame(index=default_index, data=random_values) mock_dataframe = mock_dataframe.tz_localize(user.pytz_timezone) return mock_dataframe
def test_dataframe_creation(self): start_date = get_current_date_months_ago(3) end_date = datetime.date.today() dataframe = self._get_mock_dataframe(self.default_user) dataframe_date_appended = force_start_end_data_to_dataframe(user=self.default_user, dataframe=dataframe, start_date=start_date, end_date=end_date) # if it's appended new dates correctly, the index will be greater than before self.assertGreater(dataframe_date_appended.index.size, dataframe.index.size)
def test_that_start_date_will_return_complete_daily_index_even_if_no_values_exist(self): """ An API Query with a start_date should always return data saying null if there is no data This logic ensures matching indices on the frontend """ start_date = get_current_date_months_ago(6) non_existent_date = get_current_date_months_ago(-6) request_params = { 'start_date': start_date, 'frequency': 'daily', 'complete_date_range_in_daily_frequency': True } response = self.client.get(self.url, data=request_params) # response.data.keys() is a list of isoformat strings (with timezones), but they always have the date # so a bit of laziness here, just check for the matching string start_date_in_response = any(start_date.isoformat() in x for x in response.data.keys()) fake_date_in_response = any(non_existent_date.isoformat() in x for x in response.data.keys()) self.assertTrue(start_date_in_response) self.assertFalse(fake_date_in_response)
class SupplementLogRequestParametersSerializer(serializers.Serializer): start_date = serializers.DateField(default=get_current_date_months_ago(3)) frequency = serializers.ChoiceField([DAILY_FREQUENCY, MONTHLY_FREQUENCY, None], default=None) # this is a bit tricky to explain, but if true it means to always have the results for any daily frequencies # to include the entire date_range from start end date range, which will result in a lot of null/empty data complete_date_range_in_daily_frequency = serializers.BooleanField(default=False) def validate(self, validated_data): if not validated_data['frequency'] and validated_data['complete_date_range_in_daily_frequency']: raise ValidationError('If there is no frequency, results should not enclose all date ranges between start ' 'and ending periods') return validated_data
def test_productivity_log_works_with_appending_start_and_end_dates(self): start_date = get_current_date_months_ago(12) params = { 'start_date': start_date.isoformat(), 'complete_date_range_in_daily_frequency': True, } response = self.client.get(self.url, data=params) response_amount = len(response.data.keys()) productivity_logs = DailyProductivityLog.objects.filter(user=self.default_user).count() self.assertEqual(response.status_code, 200) self.assertGreater(response_amount, productivity_logs)
def test_that_start_date_will_return_complete_daily_index_even_if_no_values_exist( self): """ An API Query with a start_date should always return data saying null if there is no data This logic ensures matching indices on the frontend """ start_date = get_current_date_months_ago(6) non_existent_date = get_current_date_months_ago(-6) request_params = { 'start_date': start_date, 'frequency': 'daily', 'complete_date_range_in_daily_frequency': True } response = self.client.get(self.url, data=request_params) # response.data.keys() is a list of isoformat strings (with timezones), but they always have the date # so a bit of laziness here, just check for the matching string start_date_in_response = any(start_date.isoformat() in x for x in response.data.keys()) fake_date_in_response = any(non_existent_date.isoformat() in x for x in response.data.keys()) self.assertTrue(start_date_in_response) self.assertFalse(fake_date_in_response)
def test_dataframe_creation(self): start_date = get_current_date_months_ago(3) end_date = datetime.date.today() dataframe = self._get_mock_dataframe(self.default_user) dataframe_date_appended = force_start_end_data_to_dataframe( user=self.default_user, dataframe=dataframe, start_date=start_date, end_date=end_date) # if it's appended new dates correctly, the index will be greater than before self.assertGreater(dataframe_date_appended.index.size, dataframe.index.size)
class ProductivityLogRequestParametersSerializer(serializers.Serializer): start_date = serializers.DateField(default=get_current_date_months_ago(3)) cumulative_window = serializers.IntegerField(default=1, min_value=1, max_value=365 * 3) complete_date_range_in_daily_frequency = serializers.BooleanField(default=False)