Beispiel #1
0
        /// <summary>
        /// Iterate html main rows to get main fields.
        /// </summary>
        /// <param name="htmlDocument">.</param>
        /// <param name="pageSize">.</param>
        /// <returns>.</returns>
        private IList <HackerNewsItem> ReadMainFields(HtmlDocument htmlDocument, int pageSize)
        {
            IList <HackerNewsItem> hackerNewsItem;

            // Use the full path for html well formed
            string xpath = $"/html/body/center/table[@id=\"hnmain\"]/tbody/tr/td/table/tbody/tr[@id][position()>0 and position()<={pageSize}]";

            HtmlNodeCollection htmlNodeList = htmlDocument.DocumentNode.SelectNodes(xpath);

            hackerNewsItem = new List <HackerNewsItem>(htmlNodeList.Count);

            foreach (HtmlNode htmlNode in htmlNodeList)
            {
                // Remove extra children
                while (htmlNode.ChildNodes.FirstOrDefault(x => x.Name.Equals("#text")) != null)
                {
                    htmlNode.ChildNodes.Remove(htmlNode.ChildNodes.FirstOrDefault(x => x.Name.Equals("#text")));
                }

                HackerNewsItem newHackerNewsItem = new HackerNewsItem();

                // Id is inside element as "Id" over table row tag
                newHackerNewsItem.Id = StringConverter.GetInt32(htmlNode.Attributes["id"].Value);

                // Rank order ends with "." like "1."
                newHackerNewsItem.RankOrder = StringConverter.GetInt32(htmlNode.ChildNodes.FirstOrDefault().InnerText.Replace(".", ""));

                // Title is inside a link tag
                newHackerNewsItem.Title = htmlNode.ChildNodes.LastOrDefault().InnerText;

                hackerNewsItem.Add(newHackerNewsItem);
            }

            return(hackerNewsItem);
        }
        async Task processPost(MainPage mainPage, int i)
        {
            HackerNewsItem item = await getDetail(mainPage, i);

            ListViewItems.Add(item.title);
            HackerNewsItems.Add(item);
        }
Beispiel #3
0
        /// <summary>
        /// Iterate html main rows to get main fields.
        /// </summary>
        /// <param name="xmlDocument">.</param>
        /// <param name="pageSize">.</param>
        /// <returns>.</returns>
        private IList <HackerNewsItem> ReadMainFields(XmlDocument xmlDocument, int pageSize)
        {
            IList <HackerNewsItem> hackerNewsItem;

            // Use the full path for html well formed
            string xpath = $"//table/tr[@id][position()>0 and position()<={pageSize}]";

            XmlNodeList xmlNodeList = xmlDocument.SelectNodes(xpath);

            hackerNewsItem = new List <HackerNewsItem>(xmlNodeList.Count);

            foreach (XmlNode xmlNode in xmlNodeList)
            {
                HackerNewsItem newHackerNewsItem = new HackerNewsItem();

                // Id is inside element as "Id" over table row tag
                newHackerNewsItem.Id = StringConverter.GetInt32(xmlNode.Attributes["id"].Value);

                // Rank order ends with "." like "1."
                newHackerNewsItem.RankOrder = StringConverter.GetInt32(xmlNode.ChildNodes[0].ChildNodes[0].InnerText.Replace(".", ""));

                // Title is inside a link tag
                newHackerNewsItem.Title = xmlNode.ChildNodes[2].ChildNodes[0].InnerText;

                hackerNewsItem.Add(newHackerNewsItem);
            }

            return(hackerNewsItem);
        }
Beispiel #4
0
        public void CanAskForInvalidItem()
        {
            HackerNewsApi  client = new HackerNewsApi();
            HackerNewsItem item   = client.NewsItem(int.MaxValue).Result;

            Assert.IsTrue(item == null);
        }
        public async Task <List <Domain.HackerNewsItemDomain> > GetHackerNewsItemDetailsV2(List <int> Ids)
        {
            List <Domain.HackerNewsItemDomain> itemList = new List <Domain.HackerNewsItemDomain>();

            foreach (var x in Ids)
            {
                var dItem = await _context.HackerNewsItem.FindAsync(x);

                if (dItem == null)
                {
                    HackerNewsItem item = await GetHackerNewsItemDetails(x);

                    var newItem = _mapper.Map <HackerNewsItemDomain>(item);

                    await _context.HackerNewsItem.AddAsync(newItem);

                    itemList.Add(newItem);
                }
                else
                {
                    itemList.Add(dItem);
                }
            }

            await _context.SaveChangesAsync();

            return(itemList);
        }
Beispiel #6
0
        public void CanGetStory()
        {
            HackerNewsApi  client    = new HackerNewsApi();
            HackerNewsItem storyItem = client.NewsItem(GOOD_STORY_ID).Result;

            Assert.IsNotNull(storyItem);
        }
Beispiel #7
0
        async Task <HackerNewsItem> getComment(DetailPage detailPage, int i)
        {
            Debug.WriteLine("in getComment at thestart");
            HackerNewsItem item = await MainPage.getDetail(detailPage, i);

            this.comments.Add(item);
            Debug.WriteLine("in getComment at theend");
            Debug.WriteLine("added comment with text " + item.text);
            return(item);
        }
Beispiel #8
0
        public GetHackerNewsItemAsyncTests()
        {
            _id              = 1;
            _hackerNewsItem  = MockHackerNewsContractFactory.CreateMockHackerNewsItem();
            _apiAccessHelper = new Mock <IApiAccessHelper>(MockBehavior.Strict);
            _apiAccessHelper.Setup(x =>
                                   x.GetApiAsync <HackerNewsItem>(string.Format(ExternalApiUrls.HackerNewsItemUrl, _id))
                                   ).ReturnsAsync(_hackerNewsItem);

            _repository = new HackerNewsRepository(_apiAccessHelper.Object);
        }
Beispiel #9
0
 public DetailPage(HackerNewsItem item)
 {
     this.Title          = item.title;
     this.BindingContext = item;
     this.item           = item;
     this.comments       = new ObservableCollection <HackerNewsItem>();
     comments.Add(new HackerNewsItem {
         text = "ay"
     });
     InitializeComponent();
     commentsView.ItemsSource = this.comments;
     doAsyncWork();
 }
        public GetLatestHackerNewsAsyncTests()
        {
            _hackerNewsItem       = MockHackerNewsContractFactory.CreateMockHackerNewsItem();
            _hackerNewsRepository = new Mock <IHackerNewsRepository>(MockBehavior.Strict);
            SetupMockRepository(new List <int>()
            {
                _hackerNewsItem.Id
            }, _hackerNewsItem);

            _page             = 0;
            _pageSize         = 10;
            _titleSearchQuery = null;

            _businessLayer = new HackerNewsBusinessLayer(_hackerNewsRepository.Object);
        }
Beispiel #11
0
        public HackerNewsItemViewModel Map(HackerNewsItem item)
        {
            var author = this.usersService.GetUserById(item.By);

            return(new HackerNewsItemViewModel
            {
                Score = item.Score,
                By = author != null?Map(author) : new HackerNewsUserViewModel
                {
                    Id = "anonymous user", Karma = -1
                },
                Title = item.Title,
                Text = item.Text,
                Url = item.Url
            });
        }
 async void PostClicked(object sender, SelectedItemChangedEventArgs e)
 {
     if (e.SelectedItem != null)
     {
         string name  = e.SelectedItem.ToString();
         int    index = ListViewItems.IndexOf(name);
         if (index >= -1)
         {
             //Debug.WriteLine("index is "+index+", name is "+name);
             HackerNewsItem item = HackerNewsItems[index];
             await Navigation.PushAsync(new DetailPage(item));
         }
         else
         {
             Debug.WriteLine("index is -1");
         }
     }
 }
Beispiel #13
0
        public async Task <HackerNewsItem> GetItem(int Id)
        {
            try
            {
                var response = await Client.GetAsync("item/" + Id + ".json");

                response.EnsureSuccessStatusCode();

                var json = await response.Content.ReadAsStringAsync();

                HackerNewsItem itemList = JsonSerializer.Deserialize <HackerNewsItem>(json);

                return(itemList);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void GetItemById_success()
        {
            const int itemId = 42;

            var item = this.itemsService.GetItemById(itemId);

            var expectedItem = new HackerNewsItem
            {
                Id    = 42,
                Type  = "story",
                Title = "An alternative to VC: &#34;Selling In&#34;",
                By    = "sergei",
                Url   = "http://www.venturebeat.com/contributors/2006/10/10/an-alternative-to-vc-selling-in/"
            };

            Assert.NotNull(item);
            Assert.Equal(item.Url, expectedItem.Url);
            Assert.Equal(item.By, expectedItem.By);
        }
        public static async Task <HackerNewsItem> getDetail(ContentPage instance, int itemId)
        {
            string        detailUrl     = "https://hacker-news.firebaseio.com/v0/item/" + itemId + ".json";
            Task <string> getDetailTask = client.GetStringAsync(detailUrl);

            try
            {
                string         urlContents = await getDetailTask;
                HackerNewsItem item        = JsonConvert.DeserializeObject <HackerNewsItem>(urlContents);
                return(item);
            }
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
            catch (Exception e)
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
            {
                Debug.WriteLine(e.GetBaseException().ToString());
                return(new HackerNewsItem {
                    text = "none"
                });
            }
        }
 private void SetupMockRepository(List <int> newsStoryIds, HackerNewsItem newsItem)
 {
     _hackerNewsRepository.Setup(x => x.GetLatestHackerNewsStoryIdsAsync()).ReturnsAsync(newsStoryIds);
     _hackerNewsRepository.Setup(x => x.GetHackerNewsItemAsync(_hackerNewsItem.Id)).ReturnsAsync(newsItem);
 }
Beispiel #17
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            HackerNewsItem item = (HackerNewsItem)value;

            return(item.score + " points by " + item.by + " | " + item.descendants + " comments");
        }
Beispiel #18
0
        public async Task <Models.HackerNewsItem> GetHackerNewsItemDetails(int Id)
        {
            HackerNewsItem item = await _client.GetItem(Id);

            return(item);
        }