public void ToBase64_WhenCalled_ReturnsBase64()
        {
            IRedditAccessToken sut = CreateSut();

            string result = sut.ToBase64();

            Assert.IsNotNull(result);
            Assert.IsTrue(result.Trim().Length % 4 == 0 && Regex.IsMatch(result.Trim(), @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None));
        }
Esempio n. 2
0
        public async Task <IActionResult> Export(int numberOfNews = 100, [FromHeader] string redditAccessToken = null, bool includeNsfwContent = false, bool onlyNsfwContent = false)
        {
            if (numberOfNews < 0)
            {
                return(BadRequest($"The submitted value for '{nameof(numberOfNews)}' cannot be lower than 0."));
            }
            if (numberOfNews > 250)
            {
                return(BadRequest($"The submitted value for '{nameof(numberOfNews)}' cannot be greater than 250."));
            }

            IRedditAccessToken token = null;

            if (string.IsNullOrWhiteSpace(redditAccessToken) == false)
            {
                try
                {
                    token = RedditAccessToken.Create(redditAccessToken);
                }
                catch (SerializationException)
                {
                    return(BadRequest($"The submitted value for '{nameof(redditAccessToken)}' is invalid."));
                }
                catch (FormatException)
                {
                    return(BadRequest($"The submitted value for '{nameof(redditAccessToken)}' is invalid."));
                }
            }

            DashboardSettingsViewModel dashboardSettingsViewModel = new DashboardSettingsViewModel
            {
                NumberOfNews                  = numberOfNews,
                UseReddit                     = token != null,
                AllowNsfwContent              = token != null ? includeNsfwContent || onlyNsfwContent : false,
                IncludeNsfwContent            = token != null ? includeNsfwContent : false,
                NotNullableIncludeNsfwContent = token != null ? includeNsfwContent : false,
                OnlyNsfwContent               = token != null ? onlyNsfwContent : false,
                NotNullableOnlyNsfwContent    = token != null ? onlyNsfwContent : false,
                RedditAccessToken             = token?.ToBase64(),
                ExportData                    = true
            };
            IDashboard dashboard = await _dashboardFactory.BuildAsync(dashboardSettingsViewModel.ToDashboardSettings());

            DashboardExportModel dashboardExportModel = await _dashboardModelExporter.ExportAsync(dashboard);

            return(Ok(dashboardExportModel));
        }
Esempio n. 3
0
        public async Task RedditCallback_WhenCalledWithoutErrorAndStateCanBeConvertedToDashboardSettingsViewModelAndRedditAccessTokenWasReturned_ReturnsViewResultWithDashboardSettingsViewModel()
        {
            string code  = Guid.NewGuid().ToString("D");
            string state = Guid.NewGuid().ToString("D");

            int  numberOfNews       = _random.Next(25, 50);
            bool useReddit          = _random.Next(100) > 50;
            bool allowNsfwContent   = _random.Next(100) > 50;
            bool includeNsfwContent = _random.Next(100) > 50;
            bool onlyNsfwContent    = _random.Next(100) > 50;
            bool exportData         = _random.Next(100) > 50;
            DashboardSettingsViewModel dashboardSettingsViewModel = BuildDashboardSettingsViewModel(_random, numberOfNews, useReddit, allowNsfwContent, includeNsfwContent, onlyNsfwContent, null, exportData);

            IRedditAccessToken redditAccessToken = BuildRedditAccessToken(_random);

            OSDevGrp.MyDashboard.Web.Controllers.HomeController sut = CreateSut(dashboardSettingsViewModel: dashboardSettingsViewModel, redditAccessToken: redditAccessToken);

            IActionResult result = await sut.RedditCallback(code, state);

            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(ViewResult));

            ViewResult viewResult = (ViewResult)result;

            Assert.IsNotNull(viewResult);
            Assert.IsNotNull(viewResult.ViewName);
            Assert.AreEqual("Index", viewResult.ViewName);
            Assert.IsNotNull(viewResult.Model);
            Assert.IsInstanceOfType(viewResult.Model, typeof(DashboardSettingsViewModel));

            DashboardSettingsViewModel dashboardSettingsViewModelFromViewResult = (DashboardSettingsViewModel)viewResult.Model;

            Assert.IsNotNull(dashboardSettingsViewModelFromViewResult);
            Assert.AreEqual(numberOfNews, dashboardSettingsViewModelFromViewResult.NumberOfNews);
            Assert.AreEqual(useReddit, dashboardSettingsViewModelFromViewResult.UseReddit);
            Assert.AreEqual(allowNsfwContent, dashboardSettingsViewModelFromViewResult.AllowNsfwContent);
            Assert.IsNotNull(dashboardSettingsViewModelFromViewResult.IncludeNsfwContent);
            Assert.AreEqual(includeNsfwContent, dashboardSettingsViewModelFromViewResult.IncludeNsfwContent.Value);
            Assert.AreEqual(includeNsfwContent, dashboardSettingsViewModelFromViewResult.NotNullableIncludeNsfwContent);
            Assert.IsNotNull(dashboardSettingsViewModelFromViewResult.OnlyNsfwContent);
            Assert.AreEqual(onlyNsfwContent, dashboardSettingsViewModelFromViewResult.OnlyNsfwContent.Value);
            Assert.AreEqual(onlyNsfwContent, dashboardSettingsViewModelFromViewResult.NotNullableOnlyNsfwContent);
            Assert.IsNotNull(dashboardSettingsViewModelFromViewResult.RedditAccessToken);
            Assert.AreEqual(redditAccessToken.ToBase64(), dashboardSettingsViewModelFromViewResult.RedditAccessToken);
            Assert.AreEqual(exportData, dashboardSettingsViewModelFromViewResult.ExportData);
        }
Esempio n. 4
0
        protected override DashboardSettingsViewModel Build(IDashboardSettings dashboardSettings)
        {
            IRedditAccessToken redditAccessToken = dashboardSettings.RedditAccessToken;

            bool includeNsfwContent = dashboardSettings.IncludeNsfwContent;
            bool onlyNsfwContent    = dashboardSettings.OnlyNsfwContent;

            DashboardSettingsViewModel dashboardSettingsViewModel = new DashboardSettingsViewModel
            {
                NumberOfNews       = dashboardSettings.NumberOfNews,
                UseReddit          = dashboardSettings.UseReddit,
                IncludeNsfwContent = includeNsfwContent ? true : (bool?)null,
                OnlyNsfwContent    = onlyNsfwContent ? true : (bool?)null,
                RedditAccessToken  = redditAccessToken != null?redditAccessToken.ToBase64() : null
            };

            _cookieHelper.ToCookie(dashboardSettingsViewModel);

            return(dashboardSettingsViewModel);
        }
Esempio n. 5
0
        public async Task <IActionResult> RedditCallback(string code, string state, string error = null)
        {
            if (string.IsNullOrWhiteSpace(code))
            {
                throw new ArgumentNullException(nameof(code));
            }
            if (string.IsNullOrWhiteSpace(state))
            {
                throw new ArgumentNullException(nameof(state));
            }

            if (string.IsNullOrWhiteSpace(error) == false)
            {
                return(Unauthorized($"Unable to get the access token from Reddit: {error}"));
            }

            DashboardSettingsViewModel dashboardSettingsViewModel = _contentHelper.ToDashboardSettingsViewModel(state);

            if (dashboardSettingsViewModel == null)
            {
                return(BadRequest());
            }

            IRedditAccessToken redditAccessToken = await GetRedditAccessTokenAsync(code);

            if (redditAccessToken != null)
            {
                dashboardSettingsViewModel.RedditAccessToken = redditAccessToken.ToBase64();
                return(View("Index", dashboardSettingsViewModel));
            }

            dashboardSettingsViewModel.UseReddit          = false;
            dashboardSettingsViewModel.AllowNsfwContent   = false;
            dashboardSettingsViewModel.IncludeNsfwContent = false;
            dashboardSettingsViewModel.OnlyNsfwContent    = false;
            dashboardSettingsViewModel.RedditAccessToken  = null;

            return(View("Index", dashboardSettingsViewModel));
        }
Esempio n. 6
0
        public void Create_WhenCalledWithBase64_ReturnsRedditAccessToken()
        {
            string             accessToken       = Guid.NewGuid().ToString("D");
            string             tokenType         = Guid.NewGuid().ToString("D");
            int                expiresIn         = _random.Next(300, 900);
            string             scope             = Guid.NewGuid().ToString("D");
            string             refreshToken      = Guid.NewGuid().ToString("D");
            DateTime           received          = DateTime.UtcNow.AddSeconds(_random.Next(1, 30) * -1);
            IRedditAccessToken redditAccessToken = CreateSut(accessToken, tokenType, expiresIn, scope, refreshToken, received);

            IRedditAccessToken result = OSDevGrp.MyDashboard.Core.Models.RedditAccessToken.Create(redditAccessToken.ToBase64());

            Assert.IsNotNull(result);
            Assert.IsNotNull(result.AccessToken);
            Assert.AreEqual(accessToken, result.AccessToken);
            Assert.IsNotNull(result.TokenType);
            Assert.AreEqual(tokenType, result.TokenType);
            Assert.AreEqual(received.ToLocalTime().AddSeconds(expiresIn).ToString(), result.Expires.ToString());
            Assert.IsNotNull(result.Scope);
            Assert.AreEqual(scope, result.Scope);
            Assert.IsNotNull(result.RefreshToken);
            Assert.AreEqual(refreshToken, result.RefreshToken);
        }