protected void Page_Load(object sender, EventArgs e)
        {
            if (!KickPage.KickUserProfile.IsVetted)
            {
                Response.Redirect(UrlFactory.CreateUrl(UrlFactory.PageName.UserTest, KickPage.KickUserProfile.Username));
            }

            if (!Page.IsPostBack)
            {
                // In case a url is passed on the querystring check if the story
                // already exists and in that case redirect the user to the story page
                string url = Request.QueryString["url"];

                if (!string.IsNullOrEmpty(url))
                {
                    Dal.Story story = Incremental.Kick.Dal.Story.FetchStoryByUrl(url.Trim());

                    if (story != null)
                    {
                        Response.Redirect(
                            UrlFactory.CreateUrl(UrlFactory.PageName.ViewStory, story.StoryIdentifier,
                                                 story.Category.CategoryIdentifier), true);
                    }
                }

                // Bind list of categories
                Category.DataSource = CategoryCache.GetCategories(KickPage.HostProfile.HostID);
                Category.DataBind();

                // Retrieve story information if story was submitted with the bookmarklet
                Url.Text   = Request.QueryString["url"];
                Title.Text = Request.QueryString["title"];

                if (Title.Text.Length > 70)
                {
                    Title.Text = Title.Text.Substring(0, 70);
                }

                if (Title.Text.Length > 0)
                {
                    TitleNoteLabel.Text    = "NOTE: Is this title correct?<br/>";
                    TitleNoteLabel.Visible = true;
                }

                Description.Text = Request.QueryString["description"];

                if (Url.Text.Length == 0)
                {
                    Url.Focus();
                }
                else if (Title.Text.Length == 0)
                {
                    Title.Focus();
                }
                else
                {
                    Description.Focus();
                }
            }
        }
        public void GetCategoriesReturnsNullWhenCachedCategoriesNotFoundTest()
        {
            const string CacheKey = "Categories";

            var cache  = Substitute.For <IMemoryCache>();
            var config = Substitute.For <ICacheConfig>();

            object value;

            cache.TryGetValue(CacheKey, out value).Returns(x => false);

            var sut = new CategoryCache(cache, config);

            var actual = sut.GetCategories();

            actual.Should().BeNull();
        }
        public void GetCategoriesReturnsCachedCategoriesTest()
        {
            var          expected = Model.Create <List <Category> >();
            const string CacheKey = "Categories";

            var cache  = Substitute.For <IMemoryCache>();
            var config = Substitute.For <ICacheConfig>();

            object value;

            cache.TryGetValue(CacheKey, out value).Returns(
                x =>
            {
                x[1] = expected;

                return(true);
            });

            var sut = new CategoryCache(cache, config);

            var actual = sut.GetCategories();

            actual.Should().BeEquivalentTo(expected);
        }
        protected override void Render(HtmlTextWriter writer)
        {
            if (DisplayEditorLinks)
            {
                StyledPanel editorPanel = new StyledPanel();
                editorPanel.Caption = "You are the editor:";
                editorPanel.RenderTop(writer);
                writer.WriteLine(
                    @"
                <div class=""SideBarLink"">
                <a href=""{0}""><img src=""{3}/find.png"" width=""16"" height=""16"" border=""0""/></a>
                <a href=""{0}"">View upcoming stories</a></div>
                <div class=""SideBarLink"">
                <a href=""{1}""><img src=""{3}/submit.png"" width=""16"" height=""16"" border=""0""/></a>
                <a href=""{1}"">Submit a story</a></div>
                
                <div class=""SideBarLink"">
                <a href=""{2}""><img src=""{3}/community.png"" width=""16"" height=""16"" border=""0""/></a>
                <a href=""{2}"">How else can I help?</a></div>
            ",
                    UrlFactory.CreateUrl(UrlFactory.PageName.NewStories), UrlFactory.CreateUrl(UrlFactory.PageName.SubmitStory),
                    UrlFactory.CreateUrl(UrlFactory.PageName.Contribute), KickPage.StaticIconRootUrl);

                if (KickPage.HostProfile.ShowAds)
                {
                    writer.WriteLine(
                        @"
                        <div class=""SideBarLink"">
                        <a href=""{0}""><img src=""{1}/adsense.png"" width=""16"" height=""16"" border=""0""/></a>
                        <a href=""{0}"">Earn money</a> </div>
                    ",
                        UrlFactory.CreateUrl(UrlFactory.PageName.EarnMoney), KickPage.StaticIconRootUrl);
                }

                editorPanel.RenderBottom(writer);
            }

            /* NOTE: GJ: removing ads from here - they should be set in the template
             * if (this.DisplayAds && this.KickPage.DisplayAds) {
             *  StyledPanel adsPanel = new StyledPanel();
             *  adsPanel.StyledPanelStyle = StyledPanelStyle.GreenPanelPlain;
             *  adsPanel.Caption = "";
             *  adsPanel.RenderTop(writer);
             *
             *  GoogleWideSkyscraper googleAds = new GoogleWideSkyscraper();
             *  this.Controls.Add(googleAds);
             *  googleAds.RenderControl(writer);
             *
             *  adsPanel.RenderBottom(writer);
             * }*/

            if (DisplayTags)
            {
                StyledPanel categoryPanel = new StyledPanel();

                string userTagsUrl;
                if (KickPage.KickUserProfile.IsValidated)
                {
                    userTagsUrl = UrlFactory.CreateUrl(UrlFactory.PageName.UserTags, KickPage.KickUserProfile.Username);
                }
                else
                {
                    userTagsUrl = UrlFactory.CreateUrl(UrlFactory.PageName.Login);
                }

                categoryPanel.Caption =
                    String.Format(
                        @"Tags: <span style=""font-size:0.7em"">  <a href=""{0}"">all tags</a> - <a href=""{1}"">your tags</a></span><br /><br />",
                        UrlFactory.CreateUrl(UrlFactory.PageName.ViewTags), userTagsUrl);
                categoryPanel.RenderTop(writer);

                TagCloud tagCloud = new TagCloud();
                Controls.Add(tagCloud);
                tagCloud.DataBind(TagCache.GetTopHostTags(KickPage.HostProfile.HostID, 80));
                tagCloud.RenderControl(writer);

                categoryPanel.RenderBottom(writer);
            }

            if (DisplayCategories)
            {
                StyledPanel categoryPanel = new StyledPanel();
                categoryPanel.Caption = "Story categories:";
                categoryPanel.RenderTop(writer);
                CategoryCollection categories = CategoryCache.GetCategories(KickPage.HostProfile.HostID);
                foreach (Category category in categories)
                {
                    string url      = UrlFactory.CreateUrl(UrlFactory.PageName.ViewCategory, category.CategoryIdentifier);
                    string iconHtml = "";
                    if (category.IconNameSpecified)
                    {
                        iconHtml =
                            String.Format(@"<a href=""{0}""><img src=""{1}"" width=""16"" height=""16"" border=""0""/></a>", url,
                                          KickPage.StaticIconRootUrl + "/" + category.IconName);
                    }

                    writer.WriteLine(
                        @"<div class=""SideBarLink"">{0}
                        <a href=""{1}"">{2}</a>
                        <span class=""LightLink""><a href=""{1}/upcoming"">[find]</a></span></div>",
                        iconHtml, url, category.Name);
                }

                writer.WriteLine(@"<br /><p align=""center""><a href=""mailto:{0}"">Suggest a new category</a></p>",
                                 KickPage.HostProfile.Email);
                categoryPanel.RenderBottom(writer);
            }

            if (DisplayWhatElse)
            {
                StyledPanel miscPanel = new StyledPanel();
                miscPanel.Caption = "What else?";
                miscPanel.RenderTop(writer);

                writer.WriteLine(
                    @"
                <div class=""SideBarLink"">  
                <a href=""{0}""><img src=""{1}/submit.png"" width=""16"" height=""16"" border=""0""/></a>
                <a href=""{0}"">Add our feeds to your site</a>
                </div>

                <div class=""SideBarLink"">
                <a href=""{2}""><img src=""{1}/community.png"" width=""16"" height=""16"" border=""0""/></a>
                <a href=""{2}"">Help us spread the word</a></div>

            ",
                    UrlFactory.CreateUrl(UrlFactory.PageName.JavaScriptFeeds), KickPage.StaticIconRootUrl,
                    UrlFactory.CreateUrl(UrlFactory.PageName.Contribute));

                miscPanel.RenderBottom(writer);
            }
        }