JavaRush /جاوا بلاگ /Random-UR /ہم مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کر ر...

ہم مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کر رہے ہیں۔ (حصہ 1) - "A سے Z تک جاوا پروجیکٹ"

گروپ میں شائع ہوا۔
ہیلو! آج ہم JavaRush میں مضامین کے ایک گروپ کی رکنیت شامل کریں گے۔ یہ GitHub پر JRTB-5 جاری کرنے کے مساوی ہے۔ میں وضاحت کرتا ہوں: JavaRush کا ایک سیکشن ہے جسے Articles کہتے ہیں ، اور اس میں مضامین کے گروپ ہیں۔ خیال یہ ہے کہ ٹیلی گرام بوٹ کے ذریعے ایک یا زیادہ گروپس سے کسی نئے مضمون کے بارے میں اطلاعات موصول کریں۔"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 1

JRTB-5 شامل کریں۔

ہم کہتے ہیں کہ مجھے کامیابی کی کہانیاں گروپ کے مضامین میں دلچسپی ہے ۔ لہذا، میں اس گروپ سے اپ ڈیٹس کو سبسکرائب کرنا چاہتا ہوں اور ہر بار ایک نئی اشاعت کا لنک حاصل کرنا چاہتا ہوں۔ اس کام کے حصے کے طور پر، ہمیں JavaRush میں گروپس کے ساتھ کام کرنے کے لیے اوپن API کا استعمال سیکھنے کی ضرورت ہے۔ بس اسی لمحے ایسی بات آگئی۔ اوپن API کی تفصیل کا لنک یہ ہے ۔
دوستو! کیا آپ فوری طور پر جاننا چاہتے ہیں کہ جب کسی پروجیکٹ یا نئے مضمون کے لیے نیا کوڈ جاری کیا جائے؟ میرے ٹی جی چینل کو جوائن کریں ۔ وہاں میں اپنے مضامین، خیالات اور اوپن سورس ڈیولپمنٹ کو اکٹھا کرتا ہوں۔

اکڑنا کیا ہے؟ آئیے اب اس کا پتہ لگائیں۔

ہم نے ابھی تک اکڑ کے بارے میں بات نہیں کی۔ ان لوگوں کے لیے جو نہیں جانتے، میں مختصراً وضاحت کروں گا: یہ وہ جگہ ہے جہاں آپ سرور کے API کو کھلے عام دیکھ سکتے ہیں اور اس سے کچھ درخواستیں کرنے کی کوشش کر سکتے ہیں۔ عام طور پر، ایک ہجوم ممکنہ درخواستوں کو گروپ کرتا ہے۔ ہمارے معاملے میں، تین گروپس ہیں: فورم سوال ، گروپ ، پوسٹ ۔ ہر گروپ میں ایک یا زیادہ درخواستیں ہوں گی جو اس درخواست کو بنانے کے لیے تمام ضروری ڈیٹا کی نشاندہی کرتی ہیں (یعنی کون سے اضافی پیرامیٹرز پاس کیے جا سکتے ہیں، ان کے ساتھ کیا کرنا ہے، کون سا HTTP طریقہ، وغیرہ)۔ میں آپ کو مشورہ دیتا ہوں کہ اس موضوع پر مزید پڑھیں اور دیکھیں، کیونکہ یہ ترقی کا وہ حصہ ہے جس کا سامنا آپ میں سے تقریباً ہر ایک کو ہوگا۔ اس کا پتہ لگانے کے لیے، آئیے معلوم کریں کہ JavaRush میں کتنے گروپس ہیں۔ ایسا کرنے کے لیے، گروپ کنٹرولر گروپ کو پھیلائیں اور Get request /api/1.0/rest/groups/count کو منتخب کریں ۔ یہ ہمیں JavaRush میں گروپوں کی تعداد واپس کر دے گا۔ آئیے دیکھتے ہیں: "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 2تصویر سے پتہ چلتا ہے کہ یہ استفسار کئی پیرامیٹرز (استفسار، قسم، فلٹر) کو سپورٹ کرتا ہے۔ اس درخواست کو آزمانے کے لیے، آپ کو Try it out بٹن تلاش کرنے کی ضرورت ہے ، جس کے بعد ان پیرامیٹرز کو کنفیگر کیا جا سکتا ہے: "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 3آپ وہاں قسم، فلٹر اور استفسار کو بھی ترتیب دے سکتے ہیں (یہ دراصل یہاں دلچسپ ہے: یہ ایک متن کی تلاش ہوگی گروپ)۔ لیکن ابھی کے لیے، آئیے اسے بغیر کسی پابندی کے چلائیں اور دیکھیں کہ JavaRush میں کتنے گروپس ہیں۔ ایسا کرنے کے لیے، Execute پر کلک کریں۔ بالکل نیچے اس درخواست کا جواب (سرور رسپانس سیکشن میں) ہوگا: ہم دیکھتے ہیں کہ کل 30"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 4 گروپس ہیں ، یہ درخواست 95ms میں مکمل ہوئی اور جواب میں کچھ ہیڈرز کا ایک سیٹ ہے۔ اگلا، آئیے کچھ پیرامیٹرز کو ترتیب دینے کی کوشش کرتے ہیں۔ آئیے COMPANY قدر کے برابر قسم کا پیرامیٹر منتخب کریں اور دیکھیں کہ نتیجہ کیسے بدلتا ہے: ان میں سے 4 ہیں۔ اسے کیسے چیک کریں؟ یہ آسان ہے: آپ ویب سائٹ پر جا سکتے ہیں، آرٹیکل سیکشن تلاش کر سکتے ہیں، تمام گروپس کو منتخب کر سکتے ہیں اور وہاں مناسب فلٹر شامل کر سکتے ہیں ( https://javarush.com/groups/all?type=COMPANY )۔ اور ہاں، واقعی، ان میں سے صرف 4 ہیں، حالانکہ اصل میں تین ہیں :D اب تک یہ فٹ بیٹھتا ہے۔ ویسے اگر ہم یونیورسٹیوں کا جائزہ لیں تو ابھی تک کوئی نہیں ہے۔ صرف تفریح ​​کے لیے، دیکھیں کہ کیا ہوتا ہے اگر آپ فلٹر = MY کو براؤزر میں سیٹ کرتے ہیں جہاں آپ Javarush میں لاگ ان ہیں اور لاگ ان نہیں ہیں۔ اکڑ کے بارے میں مزید - Habré پر اس مضمون میں ۔"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 5"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 6

گروپس کے لیے Javarush API کے لیے کلائنٹ لکھنا

اب، اوپن API کی بنیاد پر، ہم ایک جاوا کلائنٹ لکھیں گے جو درخواستیں کر سکتا ہے، جوابات وصول کر سکتا ہے اور یہ جانتا ہے کہ کون سی اشیاء پہنچیں گی۔ ہم ماڈلز سیکشن سے (صفحہ کے بالکل نیچے) سے بھی اشیاء لیں گے۔ آئیے ایک نیا پیکج بنائیں اور اسے سروس، ریپوزٹری کے ساتھ جاوارشکلینٹ کہتے ہیں۔ مستقبل میں، ہم اسے Javarush Community تنظیم کے اندر ایک علیحدہ لائبریری میں منتقل کریں گے اور اسے خصوصی طور پر انحصار کے طور پر استعمال کریں گے۔
میں نے پہلے ہی مضمون میں جاوا کلائنٹس بنانے کے بارے میں لکھا ہے "Skyscanner API کے لیے کلائنٹ بنانے اور اسے jCenter اور Maven Central میں شائع کرنے کے لیے رہنما" ۔
سب سے پہلے، آپ کو JavaRush API میں HTTP درخواستیں بنانے کے لیے Unitrest، ایک لائبریری شامل کرنے کی ضرورت ہے۔
<dependency>
  <groupId>com.konghq</groupId>
  <artifactId>unirest-java</artifactId>
  <version>${unirest.version}</version>
</dependency>
اور ورژن کو پراپرٹیز بلاک میں رکھیں:
<unirest.version>3.11.01</unirest.version>
ایک بار جب ہمارے پاس انحصار ہو جائے تو ہم کوڈ شامل کرنا شروع کر سکتے ہیں۔ آئیے JavaRushGroupClient گروپس کے لیے ایک کلائنٹ بنائیں اور JavaRushGroupClientImpl کلاس میں عمل درآمد کریں۔ لیکن پہلے آپ کو DTOs (ڈیٹا ٹرانسفر آبجیکٹ) بنانے کی ضرورت ہے - یعنی وہ کلاسز جن کی اشیاء کلائنٹ کے لیے ضروری تمام ڈیٹا لے کر جائیں گی۔ تمام ماڈلز کو اکڑ کر دیکھا جا سکتا ہے۔ بالکل نیچے ایک سیکشن Models ہے ، جس میں آپ ان کو شمار کر سکتے ہیں۔ swagger میں GroupDiscussionInfo ایسا لگتا ہے : javarushclient پیکیج میں، ہم ایک dto"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی اہلیت کو شامل کرنا۔  حصہ 1 - 7 پیکیج بنائیں گے ، جس میں ہم swagger کے ڈیٹا کی بنیاد پر، درج ذیل کلاسز کو شامل کریں گے:
  • MeGroupInfoStatus :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    /**
    * Member group status.
    */
    public enum MeGroupInfoStatus {
       UNKNOWN, CANDIDATE, INVITEE, MEMBER, EDITOR, MODERATOR, ADMINISTRATOR, BANNED
    }

  • MeGroupInfo :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    import lombok.Data;
    
    /**
    * Group information related to authorized user. If there is no user - will be null.
    */
    @Data
    public class MeGroupInfo {
       private MeGroupInfoStatus status;
       private Integer userGroupId;
    }

  • گروپ انفو ٹائپ :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    /**
    * Group Info type;
    */
    public enum GroupInfoType {
       UNKNOWN, CITY, COMPANY, COLLEGE, TECH, SPECIAL, COUNTRY
    }

  • صارف کی بحث کی معلومات :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    import lombok.Data;
    
    /**
    * DTO for User discussion info.
    */
    @Data
    public class UserDiscussionInfo {
    
       private Boolean isBookmarked;
       private Integer lastTime;
       private Integer newCommentsCount;
    }

  • گروپ مرئیت کا ڈیٹا :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    /**
    * Group Visibility status.
    */
    public enum GroupVisibilityStatus {
       UNKNOWN, RESTRICTED, PUBLIC, PROTECTED, PRIVATE, DISABLED, DELETED
    }

  • پھر - GroupInfo :

    package com.github.javarushcommunity.jrtb.javarushclient.dto;
    
    import lombok.Data;
    import lombok.ToString;
    
    /**
    * Group Info DTO class.
    */
    @Data
    @ToString
    public class GroupInfo {
    
       private Integer id;
       private String avatarUrl;
       private String createTime;
       private String description;
       private String key;
       private Integer levelToEditor;
       private MeGroupInfo meGroupInfo;
       private String pictureUrl;
       private String title;
       private GroupInfoType type;
       private Integer userCount;
       private GroupVisibilityStatus visibilityStatus;
    }

چونکہ GroupInfo اور GroupDiscussionInfo تقریباً ایک جیسے ہیں، آئیے انہیں وراثت میں جوڑتے ہیں - GroupDiscusionInfo :
package com.github.javarushcommunity.jrtb.javarushclient.dto;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

/**
* Group discussion info class.
*/
@EqualsAndHashCode(callSuper = true)
@Data
@ToString(callSuper = true)
public class GroupDiscussionInfo extends GroupInfo {

   private UserDiscussionInfo userDiscussionInfo;
   private Integer commentsCount;
}
ہمیں GroupFilter کی درخواست کے لیے ایک فلٹر کی بھی ضرورت ہوگی :
package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* Filters for group requests.
*/
public enum GroupFilter {

   UNKNOWN, MY, ALL
}
ID کے ذریعے حاصل کرنے کی درخواست میں، یہ GroupDiscussionInfo واپس کرتا ہے، اور گروپوں کے مجموعہ کی درخواست میں، آپ GroupInfo اور GroupDiscussionInfo دونوں حاصل کر سکتے ہیں۔ چونکہ درخواستوں میں قسم، استفسار، فلٹر، آفسیٹ اور حد ہوسکتی ہے، آئیے ایک علیحدہ GroupRequestArgs کلاس بنائیں اور اسے بلڈر کلاس بنائیں (پڑھیں کہ بلڈر پیٹرن کیا ہے):
package com.github.javarushcommunity.jrtb.javarushclient.dto;

import lombok.*;

import java.util.HashMap;
import java.util.Map;

import static java.util.Objects.nonNull;

/**
* Request arguments for group requests.
*/
@Builder
@Getter
public class GroupRequestArgs {

   private final String query;
   private final GroupInfoType type;
   private final GroupFilter filter;

   /**
    * specified where to start getting groups
    */
   private final Integer offset;
   /**
    * Limited number of groups.
    */
   private final Integer limit;

   public Map populateQueries() {
       Map queries = new HashMap<>();
       if(nonNull(query)) {
           queries.put("query", query);
       }
       if(nonNull(type)) {
           queries.put("type", type);
       }
       if(nonNull(filter)) {
           queries.put("filter", filter);
       }
       if(nonNull(offset)) {
           queries.put("offset", offset);
       }
       if(nonNull(limit)) {
           queries.put("limit", limit);
       }
       return queries;
   }
}
گروپوں کی تعداد تلاش کرنے کے لیے، یہ قدرے مختلف ہے۔ اس میں صرف استفسار، قسم اور فلٹر ہے۔ اور ایسا لگتا ہے کہ آپ کوڈ کو ڈپلیکیٹ نہیں کرنا چاہتے۔ ایک ہی وقت میں، اگر آپ ان کو یکجا کرنا شروع کر دیتے ہیں، تو یہ بلڈرز کے ساتھ کام کرتے وقت بدصورت نکلتا ہے۔ لہذا میں نے انہیں الگ کرنے اور کوڈ کو دہرانے کا فیصلہ کیا۔ GroupCountRequestArgs ایسا لگتا ہے :
package com.github.javarushcommunity.jrtb.javarushclient.dto;

import lombok.Builder;
import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

import static java.util.Objects.nonNull;

/**
* Request arguments for group count requests.
*/
@Builder
@Getter
public class GroupsCountRequestArgs {
   private final String query;
   private final GroupInfoType type;
   private final GroupFilter filter;

   public Map populateQueries() {
       Map queries = new HashMap<>();
       if (nonNull(query)) {
           queries.put("query", query);
       }
       if (nonNull(type)) {
           queries.put("type", type);
       }
       if (nonNull(filter)) {
           queries.put("filter", filter);
       }
       return queries;
   }
}
ہاں، میں نے یہ ذکر نہیں کیا کہ آخری دو کلاسوں میں پاپولیٹ کیوئریز کا طریقہ ہے، جو استفسار کرنے کے لیے نقشہ تیار کرے گا (آپ اسے بعد میں دیکھیں گے)۔ اوپر بیان کردہ کلاسوں کی بنیاد پر، آئیے JavaRushGroupClient کے لیے ایک انٹرفیس بنائیں :
package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;

import java.util.List;

/**
 * Client for Javarush Open API corresponds to Groups.
 */
public interface JavaRushGroupClient {

    /**
     * Get all the {@link GroupInfo} filtered by provided {@link GroupRequestArgs}.
     *
     * @param requestArgs provided {@link GroupRequestArgs}.
     * @return the collection of the {@link GroupInfo} objects.
     */
    List<GroupInfo> getGroupList(GroupRequestArgs requestArgs);

    /**
     * Get all the {@link GroupDiscussionInfo} filtered by provided {@link GroupRequestArgs}.
     *
     * @param requestArgs provided {@link GroupRequestArgs}
     * @return the collection of the {@link GroupDiscussionInfo} objects.
     */
    List<GroupDiscussionInfo> getGroupDiscussionList(GroupRequestArgs requestArgs);

    /**
     * Get count of groups filtered by provided {@link GroupRequestArgs}.
     *
     * @param countRequestArgs provided {@link GroupsCountRequestArgs}.
     * @return the count of the groups.
     */
    Integer getGroupCount(GroupsCountRequestArgs countRequestArgs);

    /**
     * Get {@link GroupDiscussionInfo} by provided ID.
     *
     * @param id provided ID.
     * @return {@link GroupDiscussionInfo} object.
     */
    GroupDiscussionInfo getGroupById(Integer id);
}
جب ہم GroupInfo یا GroupDiscussionInfo معلومات شامل کرنا چاہتے ہیں تو کیس کے لیے دو مختلف درخواستیں۔ دوسری صورت میں، یہ سوالات ایک جیسے ہیں، اور فرق صرف یہ ہوگا کہ ایک میں شامل بحث کا جھنڈا درست ہوگا، اور دوسرے میں یہ غلط ہوگا۔ اس لیے تین نہیں بلکہ 4 طریقے تھے۔ اب عمل درآمد شروع کریں:
package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;
import kong.unirest.GenericType;
import kong.unirest.Unirest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;

/**
* Implementation of the {@link JavaRushGroupClient} interface.
*/
@Component
public class JavaRushGroupClientImpl implements JavaRushGroupClient {

   private final String javarushApiGroupPath;

   public JavaRushGroupClientImpl(@Value("${javarush.api.path}") String javarushApi) {
       this.javarushApiGroupPath = javarushApi + "/groups";
   }

   @Override
   public List<GroupInfo> getGroupList(GroupRequestArgs requestArgs) {
       return Unirest.get(javarushApiGroupPath)
               .queryString(requestArgs.populateQueries())
               .asObject(new GenericType<list<GroupInfo>>() {
               })
               .getBody();
   }

   @Override
   public List<GroupDiscussionInfo> getGroupDiscussionList(GroupRequestArgs requestArgs) {
       return Unirest.get(javarushApiGroupPath)
               .queryString(requestArgs.populateQueries())
               .asObject(new GenericType<list<GroupDiscussionInfo>>() {
               })
               .getBody();
   }

   @Override
   public Integer getGroupCount(GroupsCountRequestArgs countRequestArgs) {
       return Integer.valueOf(
               Unirest.get(String.format("%s/count", javarushApiGroupPath))
                       .queryString(countRequestArgs.populateQueries())
                       .asString()
                       .getBody()
       );
   }

   @Override
   public GroupDiscussionInfo getGroupById(Integer id) {
       return Unirest.get(String.format("%s/group%s", javarushApiGroupPath, id.toString()))
               .asObject(GroupDiscussionInfo.class)
               .getBody();
   }


}
میں پہلے سے واقف ویلیو تشریح کا استعمال کرتے ہوئے کنسٹرکٹر میں API کا راستہ شامل کرتا ہوں۔ اس سے یہ ظاہر ہوتا ہے کہ تشریح کے اندر کی قدر پراپرٹی فائل میں کسی فیلڈ سے مساوی ہے۔ لہذا، آئیے application.properties میں ایک نئی لائن شامل کریں:
javarush.api.path=https://javarush.com/api/1.0/rest
یہ قدر اب تمام API کلائنٹس کے لیے ایک جگہ ہوگی، اور اگر API کا راستہ تبدیل ہوتا ہے، تو ہم اسے جلدی سے اپ ڈیٹ کر دیں گے۔ اس سے پہلے، میں نے مائکروسکوپ سے ناخن مارے، یونیریسٹ کے ذریعے HTTP کی درخواست سے جواب موصول ہوا، اس کا ایک تار میں ترجمہ کیا اور پھر جیکسن کے ذریعے اس سٹرنگ کو پارس کیا... یہ خوفناک، تھکا دینے والا تھا اور بہت سی اضافی چیزوں کی ضرورت تھی۔ اس لائبریری میں آپ دیکھ سکتے ہیں کہ یہ کیسا لگتا ہے۔ جیسے ہی میں اس پر ہاتھ اٹھاؤں گا، میں ہر چیز کو ری ایکٹر کر دوں گا۔
کوئی بھی جو اس لائبریری کو اپ ڈیٹ کرنے کی کوشش کرنا چاہتا ہے - صرف unirest لائبریری کے ٹولز کا استعمال کرتے ہوئے موصول ہونے والی اشیاء کو شامل کریں - ذاتی پیغام میں لکھیں یا لائبریری میں ہی ایک نئے شمارے کے طور پر لکھیں۔ یہ آپ کے لیے حقیقی کام کا تجربہ ہوگا، لیکن مجھے کوئی اعتراض نہیں۔ میں مکمل ضابطہ کا جائزہ لوں گا اور ضرورت پڑنے پر مدد کروں گا۔
اب سوال یہ ہے کہ کیا ہمارا کوڈ ہماری توقع کے مطابق کام کرتا ہے؟ جواب آسان ہے: آپ کو صرف ان کے لیے ٹیسٹ لکھنے کی ضرورت ہے۔ جیسا کہ میں نے ایک سے زیادہ بار کہا ہے، ڈویلپرز کو ٹیسٹ لکھنے کے قابل ہونا چاہیے۔ لہذا، اپنے Swagger UI کا استعمال کرتے ہوئے، ہم درخواستیں بھیجیں گے، جوابات کو دیکھیں گے اور متوقع نتائج کے طور پر ٹیسٹوں میں ان کی جگہ لیں گے۔ آپ نے فوری طور پر محسوس کیا ہوگا کہ گروپوں کی تعداد جامد نہیں ہے اور تبدیل ہوسکتی ہے۔ اور تم ٹھیک کہتے ہو۔ سوال صرف یہ ہے کہ یہ تعداد کتنی بار تبدیل ہوتی ہے؟ بہت کم، اس لیے کئی مہینوں کے دوران ہم کہہ سکتے ہیں کہ یہ قدر جامد ہوگی۔ اور اگر کچھ بدل جاتا ہے، تو ہم ٹیسٹوں کو اپ ڈیٹ کریں گے۔ Meet - JavaRushGroupClientTest:
package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupsCountRequestArgs;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static com.github.javarushcommunity.jrtb.javarushclient.dto.GroupInfoType.TECH;

@DisplayName("Integration-level testing for JavaRushGroupClientImplTest")
class JavaRushGroupClientTest {

   private final JavaRushGroupClient groupClient = new JavaRushGroupClientImpl("https://javarush.com/api/1.0/rest");

   @Test
   public void shouldProperlyGetGroupsWithEmptyArgs() {
       //given
       GroupRequestArgs args = GroupRequestArgs.builder().build();

       //when
       List<GroupInfo> groupList = groupClient.getGroupList(args);

       //then
       Assertions.assertNotNull(groupList);
       Assertions.assertFalse(groupList.isEmpty());
   }

   @Test
   public void shouldProperlyGetWithOffSetAndLimit() {
       //given
       GroupRequestArgs args = GroupRequestArgs.builder()
               .offset(1)
               .limit(3)
               .build();

       //when
       List<GroupInfo> groupList = groupClient.getGroupList(args);

       //then
       Assertions.assertNotNull(groupList);
       Assertions.assertEquals(3, groupList.size());
   }

   @Test
   public void shouldProperlyGetGroupsDiscWithEmptyArgs() {
       //given
       GroupRequestArgs args = GroupRequestArgs.builder().build();

       //when
       List<GroupDiscussionInfo> groupList = groupClient.getGroupDiscussionList(args);

       //then
       Assertions.assertNotNull(groupList);
       Assertions.assertFalse(groupList.isEmpty());
   }

   @Test
   public void shouldProperlyGetGroupDiscWithOffSetAndLimit() {
       //given
       GroupRequestArgs args = GroupRequestArgs.builder()
               .offset(1)
               .limit(3)
               .build();

       //when
       List<GroupDiscussionInfo> groupList = groupClient.getGroupDiscussionList(args);

       //then
       Assertions.assertNotNull(groupList);
       Assertions.assertEquals(3, groupList.size());
   }

   @Test
   public void shouldProperlyGetGroupCount() {
       //given
       GroupsCountRequestArgs args = GroupsCountRequestArgs.builder().build();

       //when
       Integer groupCount = groupClient.getGroupCount(args);

       //then
       Assertions.assertEquals(30, groupCount);
   }

   @Test
   public void shouldProperlyGetGroupTECHCount() {
       //given
       GroupsCountRequestArgs args = GroupsCountRequestArgs.builder()
               .type(TECH)
               .build();

       //when
       Integer groupCount = groupClient.getGroupCount(args);

       //then
       Assertions.assertEquals(7, groupCount);
   }

   @Test
   public void shouldProperlyGetGroupById() {
       //given
       Integer androidGroupId = 16;

       //when
       GroupDiscussionInfo groupById = groupClient.getGroupById(androidGroupId);

       //then
       Assertions.assertNotNull(groupById);
       Assertions.assertEquals(16, groupById.getId());
       Assertions.assertEquals(TECH, groupById.getType());
       Assertions.assertEquals("android", groupById.getKey());
   }
}
ٹیسٹ پہلے کی طرح اسی انداز میں لکھے جاتے ہیں۔ ہر درخواست کے لیے کئی ٹیسٹ ہوتے ہیں۔ ہر چیز کی جانچ کرنے کا کوئی فائدہ نہیں ہے، کیونکہ مجھے لگتا ہے کہ اس API کو پہلے ہی بہترین طریقے سے آزمایا گیا ہے۔

نتیجہ

اس مضمون کے حصے کے طور پر، ہم نے JavaRush API میں گروپس کے لیے جاوا کلائنٹ شامل کیا۔ جیسا کہ وہ کہتے ہیں، جیو اور سیکھو۔ جب میں اس کلائنٹ کو لکھ رہا تھا، میں نے ان کی دستاویزات کا فائدہ اٹھایا اور آسانی سے کام کو ان چیزوں کے ساتھ استعمال کیا جو وہ فراہم کرتے ہیں۔ میں آپ کی توجہ اس کام کی طرف مبذول کر رہا ہوں جو میں نے تجویز کیا تھا۔ اگر کوئی دلچسپی رکھتا ہے تو مجھے ایک نجی پیغام لکھیں، مجھے یقین ہے کہ یہ ایک بہت ہی دلچسپ تجربہ ہوگا۔ یہ پہلا حصہ تھا۔ دوسرے میں، ہم ایڈنگ کمانڈ کو براہ راست لاگو کریں گے اور (اگر ہم اسے ایک مضمون میں فٹ کرتے ہیں) تو ہم ان گروپس کی فہرست شامل کریں گے جن میں صارف نے سبسکرائب کیا ہے۔ اس کے بعد، جو بھی بوٹ کے لیے متن لکھنے کی خواہش اور ہنر رکھتا ہے، براہ کرم مجھے پی ایم میں لکھیں۔ میں اس معاملے میں ماہر نہیں ہوں اور کوئی بھی مدد بہت مددگار ہوگی۔ آئیے اس سب کو اوپن سورس ڈویلپمنٹ کے طور پر باضابطہ بنائیں، یہ دلچسپ ہوگا! ٹھیک ہے، ہمیشہ کی طرح - پسند کریں، سبسکرائب کریں، گھنٹی بجائیں ، ہمارے پروجیکٹ کو ستارہ دیں ، تبصرے لکھیں اور مضمون کی درجہ بندی کریں!
مفید لنکس

سیریز کے تمام مواد کی فہرست اس مضمون کے شروع میں ہے۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION